primer 习题9.26:假设有如下ia的定义,将ia复制到一个vector容器和一个list容器中,使用单个迭代器参数版本的erase函数将list容器中的奇数值元素删除,然后将vector容器中的偶数值元素删除。
int ia[]={0,1,1,2,3,5,8,13,21,55,89};
答案:
#include "iostream"
#include "vector"
#include "list"
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
int ia[]={0,1,1,2,3,5,8,13,21,55,89};
vector<int> ivec(ia,ia+11);
list<int> ilst(ia,ia+11);
for(vector<int>::iterator iter=ivec.begin();iter!=ivec.end();++iter)
{
if(0==*iter %2)
{
iter=ivec.erase(iter);
--iter;
}
}
for(list<int>::iterator lit=ilst.begin();lit!=ilst.end();++lit)
{
if(*lit%2!=0)
{
lit=ilst.erase(lit);
--lit;
}
}
return 0;
}
运行会出现错误。纠结了一段时间,明白了,ia[0]元素是偶数,在第一个循环的第一次遍历时将值删除,同时iter=ivec.erase(iter); --iter;错误。0删除后迭代器指向后面元素位置,然后进行--操作后有指向了其前面的元素位置,但是此时前面没有元素,顾迭代器失效,程序错误。
提供的思路是:for(vector<int>::iterator iter=ivec.begin();iter!=ivec.end();)
{
if(0==*iter %2)
{
iter=ivec.erase(iter);
continue;
}
else
++iter;
}
感觉是可以的,只是不知道会不会有隐藏的危险。
好运,共勉!