網上有不少這種例子:函數
void erase(vector<int> &v) { for(vector<int>::reverse_iterator ri=v.rbegin();ri!=v.rend();) { if(*ri % 2 == 0) { cout << "Erasing " << *ri << endl; v.erase((++ri).base()); //用base()函數將逆向iterator轉換爲正向的 } else { ++ri; } } }
但這樣再我本身的編譯環境中始終異常中斷,提示vector iterators incompatible,這種錯誤的緣由就是迭代器與容器不兼容或者失效。指針
分析一下,erase函數執行完成後返回下個元素的指針,只要將這個指針轉換成反向迭代器便可,一試果真如此。blog
void erase(vector<int> &v) { for(vector<int>::reverse_iterator ri=v.rbegin();ri!=v.rend();) { if(*ri % 2 == 0) { cout << "Erasing " << *ri << endl; ri = vector<int>::reverse_iterator(v.erase((++ri).base())); //刪除完要重置迭代器 } else { ++ri; } } }
另附正向刪除:it
for (VectorType::iterator it = someVector.begin();; it != someVector.end();) { if (*it== value) { it = someVector.erase(it); } else { ++it; } }