【无标题】

【无标题】,第1张

AssociContainer  c;  //关联容器:map set
for(auto it=c.begin();it!=c.end();) {
  if(badValue(*it))
    c.erase(it++);  //关联容器set/map c++11之前版本 erase返回值为void
  else
    ++it;
}

说明:c.erase(it++) 会把it的旧值传给erase,但在erase开始执行之前it会自增,正好符合我们的期望。


关联容器这样写没有任何问题,迭代器不会失效

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


在c++11标准之后,所有容器的erase函数都返回下一个迭代器。


所以,c++11之后,所有容器(有erase函数的容器)都可以用

vectordequelistsetmapunordered_setunordered_map
Container c;  //所有有erase的容器
for(auto it=c.begin();it!=c.end();){
  if(badValue(*it))
    it=c.erase(it);  //容器的erase返回的是下一个迭代器
  else
    ++it;
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/569357.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-09
下一篇 2022-04-09

发表评论

登录后才能评论

评论列表(0条)

保存