zoukankan      html  css  js  c++  java
  • c++ vector 删除指定元素

      只使用vector的erase函数,记住,该函数是迭代器失效,返回下一个迭代器

    #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); //不能写成arr.erase(it);
            }
            else
            {
                ++it;
            }

    看下面的一个程序,删除值为4和7的元素,为什么只删除了4?

    #include<iostream>
    #include<string>
    #include<vector>
    using namespace std;
    int main()
    {
    
        vector<int> iVec;
    
        vector<int>::iterator it;
        int i;
    
        for( i=0;i<10;i++)
    
            iVec.push_back(i);
    
        for( i=0;i<iVec.size();i++)
            cout<<iVec[i]<<ends;
        cout<<endl;
    
        for(it=iVec.begin();it!=iVec.end();++it)
    
        {
    
            if(*it ==4 || *it == 7)
    
            {
    
                it=iVec.erase(it);
    
            }
    
            else
    
                ++it;
    
        }
    
       for( i=0;i<iVec.size();i++)
            cout<<iVec[i]<<ends;
        cout<<endl;
    
    }

    没有删除7,为什么?

    l例如上面这个 1 2 3 4 5 6 7 8 9
    如果要删除4 和7 两个元素
    则删除4后iterator返回5,不满足if()判断,这时++it执行两次,一次是else里面,一次是for()循环里面,导致7被错过
    改为:
     it=iVec.erase(it);
          --it;//这里回退一个

    上面的程序基本上属于弱智型程序,没必要it++,使用下面的:

        for(it=iVec.begin();it!=iVec.end();++it)
    
        {
    
            if(*it ==4 || *it == 7)
    
            {
    
                it=iVec.erase(it);
    
            }
    
         
    
        }

     (2014-12-1修改:

    上面程序经过网友指出if(*it ==4 || *it == 5)有问题,确实如此,2个相邻的元素,在for++中被跳过了。为了处理这种情况,把for循环中的it++移动到for中。

    for(it=iVec.begin();it!=iVec.end();)

    {

      if(*it==4 || *it==5)

        it=iVec.erase(it);

      else

        it++;

    }

    这样程序就可以处理4,5,4,7之类的了。)

    不用循环结合remove使用:

    1、remove并不是删除,仅仅是移除,要加上erase才能完成删除。 
    2、remove并不是删除指定位置的元素,而移除所有指定的元素。 
    3、用algorithm代替成员函数不是一个好的选择。

    remove只是简单地用"未删除"对象来填补被删除对象留下的缺口,每一个删除对象在尾部还是会留下一个相应的"死亡"对象. 
    可以这样来使用remove... 
    vector<int>vec; 
    vec.erase(remove(vec.begin(),vec.end(),value),vec.end()); //value是要删除的值

     

        
    vector<int> v;
         
        int i;
        for( i=0;i<10;i++)
    
            v.push_back(i);
    
    remove(v.begin(),v.end(),5);
        remove(v.begin(),v.end(),6);
        for(vector<int>::iterator it=v.begin();it!=v.end();it++)
        {
             
            cout<<*it<<ends;
        }

    输出:

    0123478999

    参考下一篇remove

    http://www.cnblogs.com/youxin/archive/2012/06/22/2558394.html

  • 相关阅读:
    入门菜鸟
    FZU 1202
    XMU 1246
    Codeforces 294E Shaass the Great 树形dp
    Codeforces 773D Perishable Roads 最短路 (看题解)
    Codeforces 814E An unavoidable detour for home dp
    Codeforces 567E President and Roads 最短路 + tarjan求桥
    Codeforces 567F Mausoleum dp
    Codeforces 908G New Year and Original Order 数位dp
    Codeforces 813D Two Melodies dp
  • 原文地址:https://www.cnblogs.com/youxin/p/2558383.html
Copyright © 2011-2022 走看看