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本身失效不会影响后面的迭代器。

posted @ 2018-12-29 11:18  划水程序员  阅读(764)  评论(0编辑  收藏  举报