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


    删除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;

           }

        }

  • 相关阅读:
    Codevs 1404 字符串匹配(Kmp)
    Hdu 4333 Revolving Digits(Exkmp)
    Poj 3461 Oulipo(Kmp)
    Bzoj 1877: [SDOI2009]晨跑(费用流)
    P1379 八数码难题
    P2324 [SCOI2005]骑士精神
    记 给61级讲课
    迭代加深 A* IDA* 初探
    P1347 排序
    P1888 三角函数
  • 原文地址:https://www.cnblogs.com/aukle/p/3217607.html
Copyright © 2020-2023  润新知