erase,该如何处理

erase
如果用erase删除一个元素的话会导致迭代器失效吗?
如:
vector<int>::iterator iter;
for(iter=v1.begin();iter!=v1.end();iter++)
{
    v1.erase(v1.begin());//这一步后迭代器会失效吗?
}

------解决方案--------------------
vector<int>::iterator iter = v1.begin();
while(iter!=v1.end())
{
    iter = v1.erase(iter);
}
------解决方案--------------------
引用:
引用:vector<int>::iterator iter = v1.begin();
while(iter!=v1.end())
{
    iter = v1.erase(iter);
}

那我这样改一下迭代器能重新有效吗???
vector<int>::iterator iter;
for(iter=……

erase之后会导致迭代器指向被删除元素的下一个。
所以你这里的iter++就有问题
------解决方案--------------------
你删除一个元素的时候,vector长度减少,对空间的需求也少,c++标准从来没说vector不允许收缩存储空间,所以,理论上所有从该vector获取的迭代器都可能失效。即使vector不收缩,原先的迭代器指向的元素也可能不是原来那个了(视迭代器的相对位置而定),或者指向无效数据,也算是失效。如果担心这个问题,可以考虑list或map等依赖节点的容器,这些迭代器中erase一个节点的时候其他迭代器不会失效。
------解决方案--------------------
引用:
引用:vector<int>::iterator iter = v1.begin();
while(iter!=v1.end())
{
    iter = v1.erase(iter);
}

那我这样改一下迭代器能重新有效吗???
vector<int>::iterator iter;
for(iter=……

这样修改之后迭代器iter确实会重新有效。不过你不删除iter++这一句的话,可能又会出现错误哦~
如果v1中只有一个元素,那么删除起始元素一次之后,v1为空,iter=v1.begin()等同于iter = v1.end();而对一个end()再++是不合法的行为。

#4说的“erase之后会导致迭代器指向被删除元素的下一个。”这是从外部效果上来看的。意思是对于vector{1, 2, 3, 4},最开始iter指向的元素的值为1,erase之后,再查看*iter一般来说是2,所以看起来像是迭代器指向位置改变了。其实迭代器本身是不会发生改变的,改变的只是迭代器指向的位置的元素值。就像我存了你家的地址,但是你突然搬家了,所以我找不上你了。此时你不能怪我把通讯录搞错了,只能怪你搬家不告诉我。