STL删除vector或list的方法及注意的问题

Posted on 2013-07-26 18:01  冰天雪域  阅读(680)  评论(0编辑  收藏  举报

删除vector中的元素

1.删除指定的所有对象

STL中remove()只是将待删除元素之后的元素移动到vector的前端,而不是删除。若要真正移除,需要搭配使用erase()。例子:

vector<int> vecTemp;

    vecTemp.push_back(2);

    vecTemp.push_back(4);

    vecTemp.push_back(2);

    vecTemp.push_back(5);

//原始元素顺序为2,4,2,5

    remove(vecTemp.begin(),vecTemp.end(),2);

//remove后的结果为4,5,2,5

可以看到除了前面的4,5是正确的后面的没有用了

若真要删除,则:

vecTemp.erase(remove(vecTemp.begin(),vecTemp.end(),2),vecTemp.end());

//输出结果为4,5

 

2.如果删除一个元素后要进行其它操作,如写日志等,那么就不能用上面的方法,改用循环,但需要注意,erase()之后的迭代器将失效,而erase()的返回值为当前位置的下一个位置,可以利用其返回值。例子:

vector<int>vecTemp;

    vecTemp.push_back(2);

    vecTemp.push_back(4);

    vecTemp.push_back(2);

    vecTemp.push_back(5);

    vector<int>::iterator i;

    for(i=vecTemp.begin(); i!=vecTemp.end(); )

    {

       if(*i == 2)

       {

           i = vecTemp.erase(i);

       }

       else

       {

           ++i;

       }

    }

下面的循环是不对的,运行时会出错

vector<int>::iteratori;

    for(i=vecTemp.begin(); i!=vecTemp.end(); ++i)

    {

       if(*i == 2)

       {

           vecTemp.erase(i);//执行完后i已经失效

       }

    }

 

删除list中的元素

 

1.删除所有指定的对象

list<int> listTemp;

    listTemp.push_back(2);

    listTemp.push_back(4);

    listTemp.push_back(2);

    listTemp.push_back(6);

    listTemp.push_back(5);

    listTemp.remove(2);

 

2.删除每个元素后,进行其他操作如写日志,输出等,上面的就不能满足要求,需要采用循环,但要注意erase()后迭代器失效的问题,与vector删除时一样。

例子:


 

    list<int> listTemp;

    listTemp.push_back(2);

    listTemp.push_back(4);

    listTemp.push_back(2);

    listTemp.push_back(6);

    listTemp.push_back(5);

   list< int>::iterator k;

    for(k=listTemp.begin(); k!=listTemp.end(); )

    {

       if(*k == 2)

       {

           cout<<"删除一个元素"<<endl;

           k = listTemp.erase(k);

       }

       else

       {

           ++k;

       }

    }

 

 

Copyright © 2024 冰天雪域
Powered by .NET 9.0 on Kubernetes