我有一個std :: vector <int>,我想刪除第n個元素。 我怎麼作? 算法
std::vector<int> vec; vec.push_back(6); vec.push_back(-17); vec.push_back(12); vec.erase(???);
erase
方法將以兩種方式使用: spa
刪除單個元素: 指針
vector.erase( vector.begin() + 3 ); // Deleting the fourth element
擦除範圍: code
vector.erase( vector.begin() + 3, vector.begin() + 5 ); // Deleting from fourth element to sixth element
若是您使用大向量(大小> 100,000),而且想要刪除不少元素,則建議執行如下操做: 索引
int main(int argc, char** argv) { vector <int> vec; vector <int> vec2; for (int i = 0; i < 20000000; i++){ vec.push_back(i);} for (int i = 0; i < vec.size(); i++) { if(vec.at(i) %3 != 0) vec2.push_back(i); } vec = vec2; cout << vec.size() << endl; }
該代碼將vec中沒法除以3的每一個數字複製到vec2中。 而後將其複製到vec2中。 很是快。 要處理20,000,000個元素,此算法僅需0.8秒! element
我對擦除方法作了一樣的事情,這須要不少時間: rem
Erase-Version (10k elements) : 0.04 sec Erase-Version (100k elements) : 0.6 sec Erase-Version (1000k elements): 56 sec Erase-Version (10000k elements): ...still calculating (>30 min)
實際上, erase
功能適用於兩個配置文件: get
刪除單個元素 it
iterator erase (iterator position);
刪除一系列元素 io
iterator erase (iterator first, iterator last);
因爲std :: vec.begin()標記了容器的開始,若是咱們要刪除向量中的ith元素,則可使用:
vec.erase(vec.begin() + index);
若是仔細觀察,vec.begin()只是指向向量起始位置的指針,將i的值添加到它的位置會將指針增長到i的位置,所以咱們能夠經過如下方式訪問指向ith元素的指針:
&vec[i]
因此咱們能夠這樣寫:
vec.erase(&vec[i]); // To delete the ith element
要刪除元素,請使用如下方法:
// declaring and assigning array1 std:vector<int> array1 {0,2,3,4}; // erasing the value in the array array1.erase(array1.begin()+n);
有關更普遍的概述 ,請訪問: http : //www.cplusplus.com/reference/vector/vector/erase/
先前的答案假定您始終具備帶符號的索引。 可悲的是, std::vector
使用size_type
進行索引,並使用difference_type
進行迭代器算術,所以若是啓用了「 -Wconversion」和好友功能,它們將沒法一塊兒工做。 這是回答問題的另外一種方式,同時可以處理有符號和無符號:
去除:
template<class T, class I, class = typename std::enable_if<std::is_integral<I>::value>::type> void remove(std::vector<T> &v, I index) { const auto &iter = v.cbegin() + gsl::narrow_cast<typename std::vector<T>::difference_type>(index); v.erase(iter); }
服用:
template<class T, class I, class = typename std::enable_if<std::is_integral<I>::value>::type> T take(std::vector<T> &v, I index) { const auto &iter = v.cbegin() + gsl::narrow_cast<typename std::vector<T>::difference_type>(index); auto val = *iter; v.erase(iter); return val; }