STL容器如何正确删除元素(迭代器失效问题)
先看2段代码说明问题:
AssociContainer <int> c; //关联容器:map multimap set multiset
for(auto it=c.begin();it!=c.end();)
{
if(badValue(*it))
c.erase(it++); //关联容器erase返回值为void
else
++it;
}
说明:c.erase(it++) 会把it的旧值传给erase,但在erase开始执行之前it会自增,正好符合我们的期望。关联容器这样写没有任何问题,迭代器不会失效
SeqContainer<int> c; //顺序容器:vector list deque
for(auto it=c.begin();it!=c.end();)
{
if(badValue(*it))
it=c.erase(it); //顺序容器的erase返回的是下一个迭代器
else
++it;
}
说明:此处不能再写 c.erase(it++) 因为执行c.erase(it)之后,迭代器it及其之后的所有迭代器都失效了,无法再使用;不过好在它会返回下一个迭代器所以直接利用他的返回值给it再赋值即可
根本原因是顺序容器是连续内存,你erase一个元素之后,后面的元素都要向前移动一个位置,不仅迭代器it失效,包括后面的所有迭代器都失效;同样你也能想象,insert元素也是同样的道理。
而关联容器是用二叉树存储的,erase只会使得it本身失效不会影响后面的迭代器。