关于迭代器失效的疑惑,该如何解决
关于迭代器失效的疑惑
有个地方想不明白,为什么vector<int>容器删除元素后iter=ivec.erase(iter);
迭代器不是已经指向被删除元素之后的元素了吗,如果没有--iter,那for循环的++iter就指向再往后的一个元素了.被删除元素后面那个元素不是被漏掉了吗?
为什么list<int)容器同样删除元素后--iter又不会出错了?
非常感谢 请教各位大哥指点一下
------解决方案--------------------
要删除vector中的元素的标准写法:
- 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,你再减就没有地方退了。
------解决方案--------------------
------解决方案--------------------
你在看c++primer吧。。呵呵。。。我也在看。。我两貌似看得一样快啊。。。你跟我碰到了一样的问题。。。。就是{0,1,1,2,3,5,8,13,21,55,89}; 第一个是0满足if(*iter%2==0)。。然后被删掉。。。此时迭代器就指向了最后一个元素。。再往后退的话,就是未定义。。。
我有C++primer的答案,,你要吗?我qq657974959.。。。