在使用vector的删除元素操作时,不加注意可能会出现调试出错。
比如以下的代码,欲删除向量中的元素2:
#include<iostream>
#include<vector>
using namespace std;
int main(){
vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
v.push_back(1);
v.push_back(4);
v.push_back(5);
vector<int>::iterator it = v.begin();
while(it != v.end()){
if (2 == *it)
v.erase(it);
else
++it;
}
it = v.begin();
while(it != v.end()){
cout << *it << endl;
it++;
}
return 0;
}
编译通过了,然而调试时报错
进行单步调试,发现在执行v.erase(it),即删除元素2操作后,返回的迭代器指向所删除元素后面的一个元素,即3,继续逐语句调试,重新执行while循环判断,会出现报错。
查找资料,得出结论:容器在删除或者插入一个元素之后,原来的迭代器会失效,再进行删除操作后,继续遍历时的判断条件还继续用原来的迭代器,系统无法判断是什么东西,所以报错。
解决方法:因为erase()会返回一个迭代器,这个迭代器指向刚才所删除元素的后一个元素,所以我们更改15行代码如下:
it = v.erase(it);
这样程序就运行正常了。