删除容器迭代器是一个需要斟酌的动作,务必谨慎否则会带来意想不到的危险,下我们就一起分析分析两大类容器删除迭代器的正确开启方法:
转载于:添加链接描述
导致迭代器失效的原因一般有两种:
1、迭代器对象已经变成了“野指针”,对其进行*,++,–都会引起程序内存操作异常。
2、迭代器对象所指向的内容已经不是所期望的内容,也被称为迭代器失效。
顺序容器(如:vector,string,deque和list)
关联容器(如:set,map)
两种容器在使用erase()函数时是有不同的。
1.顺序容器的erase函数都会返回下一个有效的迭代器,所以可以这样使用:
iter = vec.erase(iter);
或者是
vec.erase(iter++);
***而数组形式的容器(不包括list)是不能这样使用第二种方法的,***因为该类型容器一旦erase时,会在删除前使iter指向下一个位置,同时后面的数据会向前面移动一个位置,所以iter++之后实际指向的已经不是所期望的内容了,导致迭代器失效。
所以vector一般如下使用:
{
iter = vec.erase(iter);
}
else
{
++iter;
}
list容器删除元素方法则两种方法都可以使用:
// 第一种方法
iter = lit.erase(iter);
//第二种方法
lit.erase(iter++);
list容器是顺序容器的一种,所以erase函数会返回下一个有效地迭代器,但因为是链式存储所以数据不会向前移动,所以iter = lit.erase(iter)和lit.erase(iter++)两种方法均可用。
2.关联容器的erase函数都会返回void或被删除个数;
所以关联容器一般删除都如下使用:
{
map.erase(iter++);
}
else
{
++iter;
}