注意 c++ vector中的erase()

来源:互联网 发布:sql 关键字书写顺序 编辑:程序博客网 时间:2024/05/23 02:03

    今天帮同事解决了一个程序异常挂掉的问题,最后定位到是在vector删除元素之后,再把该对象传递给下一个app时下一个app莫名其妙的挂了。认真检查了代码发现是这里的问题。网上有个帖子,讲的挺细致的,特转载写。

#include <iostream>#include <vector>using namespace std; int main(){    vector<int> arr;    arr.push_back(6);    arr.push_back(7);    arr.push_back(8);    arr.push_back(9);    for(vector<int>::iterator it=arr.begin(); it!=arr.end(); )    {        if(* it == 8)        {            it = arr.erase(it);        }        else        {            ++it;        }    }    // 注意上面不能写成    /*    for(vector<int>::iterator it=arr.begin(); it!=arr.end(); it ++)    {        if(* it == 8)        {            arr.erase(it);            //it失效,并不指向下一个元素,成了“野指针”。        }    }     */    cout << "After remove 8:\n";    for(vector<int>::iterator it = arr.begin(); it < arr.end(); ++it)    {        cout << * it << " ";    }    cout << endl << arr.size();    cout << endl;}
还有一个示例,看了就更清楚了:
void fun(){    vector<int> iVec;    vector<int>::iterator it;    for(int i=0;i<10;i++)        iVec.push_back(i);    display(iVec);    for(it=iVec.begin();it!=iVec.end();++it)    {        if(*it ==4 || *it == 7)        {            it=iVec.erase(it);        } else {            ++it;        }    }    display(iVec);}//例如上面这个 1 2 3 4 5 6 7 8 9//如果要删除4 和7 两个元素//则删除4后iterator返回5,不满足if()判断,这时++it执行两次,一次是else里面,一次是for()循环里面,导致7被错过//实际上,应该是这样的void fun(){    vector<int> iVec;    vector<int>::iterator it;    for(int i=0;i<10;i++)        iVec.push_back(i);    display(iVec);    for(it=iVec.begin();it!=iVec.end();++it)    {        if(*it ==4 || *it == 7)        {            it=iVec.erase(it);            --it;//这里回退一个        }    }    display(iVec);}



原创粉丝点击