使用vector.erase()删除一个元素时遇到的一个有关问题
【求助】使用vector.erase()删除一个元素时遇到的一个问题
写了一个小代码玩,想要删除vector中的奇数值。
出错的情况是这样的,当我删掉第一个奇数值1之后,我看到first指向的值变成了3,continue语句跳转到while语句后再判断就报错了。
然后。。。。。。
我查了STL源码剖析,里面erase操作的源码是
这里我就感觉很奇怪了,源码中返回的position就是一个指向原先vector下一个值的地址,为什么写法1中就存在错误,而写法2就没有错误。而且调试的时候,我也看到first指向了下一个值。为什么就出现错误了。。。
个人感觉应该不是指向地址的问题。可能是iterator内部实现机制的问题。。但是没查到相关资料
求指导。。。。。。
第一次发帖,不知道这样说明够不够准确
------解决方案--------------------
google "迭代器失效"
写了一个小代码玩,想要删除vector中的奇数值。
- C/C++ code
int main() { int ia[]={0,1,3,2,3,5,8,13,21,55,89}; vector<int> vec (ia,ia+11); vector<int> ::iterator iter, first; /ector<int>::iterator temp; /*first = find(vec.begin(),vec.end(),5); last = find(vec.begin(),vec.end(),13) vec.erase(first,last);*/ first=vec.begin(); //写法1、这样会出错 while(first != vec.end()) { if ((*first) % 2 != 0) { vec.erase(first); //这样写就会出现错误 continue; } first=first+1; } /*写法2、这样不会出错 while(first != vec.end()) { if ( (*first)%2 != 0) { first = vec.erase(first); //换成这种写法就不会发生错误 continue; } first++; } */ for (iter = vec.begin(); iter != vec.end(); iter++) { cout << *iter << endl; } }
出错的情况是这样的,当我删掉第一个奇数值1之后,我看到first指向的值变成了3,continue语句跳转到while语句后再判断就报错了。
然后。。。。。。
我查了STL源码剖析,里面erase操作的源码是
- C/C++ code
iterator erase(iterator position) { if (position + 1 != end()) copy(position + 1, finish, position); --finish; destory(finish); return position; }
这里我就感觉很奇怪了,源码中返回的position就是一个指向原先vector下一个值的地址,为什么写法1中就存在错误,而写法2就没有错误。而且调试的时候,我也看到first指向了下一个值。为什么就出现错误了。。。
个人感觉应该不是指向地址的问题。可能是iterator内部实现机制的问题。。但是没查到相关资料
求指导。。。。。。
第一次发帖,不知道这样说明够不够准确
------解决方案--------------------
google "迭代器失效"