关于vector中的erase的强调
1.问题一
我们来看一串代码,这串代码利用erase函数删除了数值为3的元素,但是其实他的迭代器已经失效了(虽然从原理上来讲他之后的元素会往前移动一位),包括指向被删除元素及其之后元素的迭代器都失效。此时如果继续对it迭代器进行操作,会产生未定义行为。例如下面这串代码,会显示如下错误。
#include<iostream>
#include<vector>
using namespace std;
int main()
{vector<int>v = { 1,2,3,4,5 };for (auto it=v.begin();it!=v.end();it++){if (*it == 3){v.erase(it);}}
}
那么该如何避免这种情况呢,那就是利用erase的返回值,他会返回一个新的指向后面的元素的迭代器,我们可以利用这个来更新it值,具体如下
for (auto it = v.begin(); it != v.end(); ) {if (*it == 3) {it = v.erase(it); // 更新 it 为 erase 返回的新迭代器} else {++it;}
}