读书人

关于迭代器失效的疑惑,该如何解决

发布时间: 2012-05-20 16:03:12 作者: rapoo

关于迭代器失效的疑惑

C/C++ code
int ia[]={0,1,1,2,3,5,8,13,21,55,89};  vector<int> ivec(ia,ia+11);  list<int> ilist(ia,ia+11);  for(vector<int>::iterator iter=ivec.begin();iter!=ivec.end();++iter)      {          if(*iter%2==0)          {              iter=ivec.erase(iter);              --iter;           //VS2010加上这句就出错            }      }  for(list<int>::iterator iter=ilist.begin();iter!=ilist.end();++iter)      {          if(*iter%2!=0)          {              iter=ilist.erase(iter);              --iter;   //这里可以理解,往前移动一个元素,for循环之后++iter就指向被删除元素后面那个元素了        }      }  


有个地方想不明白,为什么vector<int>容器删除元素后iter=ivec.erase(iter);
迭代器不是已经指向被删除元素之后的元素了吗,如果没有--iter,那for循环的++iter就指向再往后的一个元素了.被删除元素后面那个元素不是被漏掉了吗?

为什么list<int)容器同样删除元素后--iter又不会出错了?
非常感谢 请教各位大哥指点一下

[解决办法]
要删除vector中的元素的标准写法:
C/C++ code
for(vector<int>::iterator iter=ivec.begin();iter!=ivec.end();/*++iter*/)  {          if(*iter%2==0)          {              iter=ivec.erase(iter);              //--iter;           //VS2010加上这句就出错            }        else        {            ++iter;        }}
[解决办法]
C/C++ code
  if(*iter%2==0)          {              iter=ivec.erase(iter);              --iter;           //VS2010加上这句就出错            }
[解决办法]
An iterator that designates the first element remaining beyond any elements removed, or a pointer to the end of the vector if no such element exists.

你删除第一个元素的时候,返回的指针指向了begin,你再减就没有地方退了。
[解决办法]
探讨

加上--iter的话会出现这个错误

[解决办法]
你在看c++primer吧。。呵呵。。。我也在看。。我两貌似看得一样快啊。。。你跟我碰到了一样的问题。。。。就是{0,1,1,2,3,5,8,13,21,55,89}; 第一个是0满足if(*iter%2==0)。。然后被删掉。。。此时迭代器就指向了最后一个元素。。再往后退的话,就是未定义。。。

我有C++primer的答案,,你要吗?我qq657974959.。。。

读书人网 >C++

热点推荐