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

  • 相关阅读:
    简单的模板解析函数
    HTML通过事件传递参数到js 二 event
    HTML通过事件传递参数到js一
    通过this获取当前点击选项相关数据
    LeetCode 20. 有效的括号(Valid Parentheses)
    LeetCode 459. 重复的子字符串(Repeated Substring Pattern)
    LeetCode 14. 最长公共前缀(Longest Common Prefix)
    LeetCode 168. Excel表列名称(Excel Sheet Column Title)
    LeetCode 171. Excel表列序号(Excel Sheet Column Number) 22
    LeetCode 665. 非递减数列(Non-decreasing Array)
  • 原文地址:https://www.cnblogs.com/youxin/p/2558383.html
Copyright © 2011-2022 走看看