AssociContainer <int> 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<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本身失效不会影响后面的迭代器。
在c++11标准之后,所有容器的erase函数都返回下一个迭代器。所以,c++11之后,所有容器(有erase函数的容器)都可以用
vector | deque | | list | set | map | unordered_set | unordered_map | | | | | | | | | | | | | | | | | | | | |
Container<int> c; //所有有erase的容器
for(auto it=c.begin();it!=c.end();){
if(badValue(*it))
it=c.erase(it); //容器的erase返回的是下一个迭代器
else
++it;
}
|