在c++primer3中的6.12和c++primer4中的9.26,出现了很相似的一个问题
即用单个迭代器版本的erase函数删除奇数值元素,在PRIMER3中,侯老大在勘误中解释了为什么无法删除,同时给出了个解决方案,但是太复杂,我没有看懂,所以决定使用其他方法。
我们知道,在容器中作出改动后,迭代器要更新,比如说0,1,1,2,3,5,8,13,21,55,89,当第一次检查到1时,1为奇数,所以需要删除,那么删除后,迭代器更新,此时,容器中的数为 0,1,2,3,5,8,13,21,55,89,那么根据想象,当迭代器再次检查到1时,也应该删除,但实际情况是,因为这个1占据了刚才删除的1的位置,迭代器认为这个数是安全的,所以不会删除,程序到这里开始失败。
那么怎么才能使程序成功呢?我用了比较笨的办法,每一次都是重头开始检查数据,发现后进行删除,如下:
list<int>::iterator it=i.begin();
for(;;)
{
if(it!=i.end())
{
if(*it%2==0)
{
i.erase(it);
it=i.begin();
}
else
it++;
}
else
break;
}
望各位高手指正~~~~~~~~~~~~