读书人

使用vector.erase()删除一个元素时遇到

发布时间: 2012-04-04 16:38:51 作者: rapoo

【求助】使用vector.erase()删除一个元素时遇到的一个问题
写了一个小代码玩,想要删除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 "迭代器失效"

读书人网 >C++

热点推荐