天天看点

c++ primer习题9.26答案错误

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;

   }

感觉是可以的,只是不知道会不会有隐藏的危险。

好运,共勉!

继续阅读