STL使用迭代器逆向删除
网上有很多这种例子:
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函数执行完成后返回下个元素的指针,只要将这个指针转换成反向迭代器即可,一试果然如此。
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; } } }
另附正向删除:
for (VectorType::iterator it = someVector.begin();; it != someVector.end();) { if (*it== value) { it = someVector.erase(it); } else { ++it; } }