钻个器皿erase的牛角尖(欢迎指导)
钻个容器erase的牛角尖(欢迎指导)今日工作遇到一个问题,以前一直使用以下方法中的第一种方式,连续删除关联
钻个容器erase的牛角尖(欢迎指导)
今日工作遇到一个问题,以前一直使用以下方法中的第一种方式,连续删除关联容器元素,今日突然得见第二种方式,被告知第一种在erase的后迭代器有可能失效,此时迭代器再自加则会崩溃,貌似有些道理,所以小弟在此请教下,求解迷津。
//第一种
AssocContainer<int> c;
...
for (AssocContainer<int>::iterator i = c.begin(); i != c.end();)
{
if (badValue(*i))
c.erase(i++); // 对于坏的值,把当前的
else
++i; // i传给erase,然后
} // 作为副作用增加i;对于好的值,只增加i
//第二种
AssocContainer<int> c;
...
for (AssocContainer<int>::iterator i = c.begin(); i != c.end();)
{
AssocContainer<int>::iterator iTemp = i++;
if (badValue(*i))
c.erase(i); // 对于坏的值,把当前的
}
STL?迭代器?erase
[解决办法]iter = c.earse(..);
可以通过earse的返回值保存下个有效的iter.
或者用erase(remove....) 惯用方法.
[解决办法] 先不说第一种和第二种erase的对象根本就不一样
你这2种方法根本就没有本质上的差别吧,erase完成后的i都是erase前的i自增后的结果
这段代码应该是effective stl上的,AssocContainer是指某一种关联容器,关联容器是有保证删除某个元素后迭代器不失效的
而对于序列容器,应该用1楼的方法,而不是lz的方法2,而这也是在effective stl里有写的
[解决办法]iterator i 定义i为迭代器,看着真别扭
[解决办法]第一个是正确的.
[解决办法]第一种, I 会先自增然后再进入erase函数. 没有问题.
[解决办法]vector<int> vec;
for(vector<int>::iterator iter = vec.begin(); iter != vec.end();)
{
if(bad) iter = vec.erase(iter);
else ++iter;
}
[解决办法]