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

  • 相关阅读:
    静静的看twittervision
    MSSQL中的随机函数
    紧张非封闭式开发中
    be my friend
    这个五一
    检讨
    SilverLight,有多少人关心呢?
    并查集模板题P3367 【模板】并查集
    并查集简单介绍
    约数之和模板题
  • 原文地址:https://www.cnblogs.com/youxin/p/2558383.html
Copyright © 2011-2022 走看看