zoukankan      html  css  js  c++  java
  • 在容器中使用erase函数,迭代器的处理

    在c++编程中,用到迭代器的时候,往往不知道如何删除当前迭代器指向的元素。

    erase函数:

      返回下一个迭代器。

    只使用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

    给一个应用列子:

    有 nn 个小朋友做游戏,他们的编号分别是 1,2,3...n1,2,3...n。他们按照编号从小到大依次顺时针围成一个圆圈,从第一个小朋友开始从 11报数,依次按照顺时针方向报数(加一),报 mm 的人会离开队伍,然后下一个小朋友会继续从 11 开始报数,直到只剩一个小朋友为止。

    输入格式

    第一行输入俩个整数,nnmm。(1 leq n,m leq 10001n,m1000

    输出格式

    输出最后一个小朋友的编号,占一行。

    样例输入

    10 5

    样例输出

    3

    #include<bits/stdc++.h>
    using namespace std;
    vector<int>a;
    int main()
    {
      int n,m;
      cin>>n>>m;
      for(int i=1;i<=n;i++)
        a.push_back(i);
      int now=1;
      vector<int>::iterator it;
      while(a.size()>1)
      {
          for(it=a.begin();it!=a.end();)
          {
              if(now==m)
              {
                  it=a.erase(it);
                  now=1;
              }
              else
              {
                 it++;
                 now++;
              }
    
          }
      }
      cout<<a[0]<<endl;
      return 0;
    }
    View Code
  • 相关阅读:
    [PY3]——heap模块 和 堆排序
    [PY3]——求TopN/BtmN 和 排序问题的解决
    [转载+补充][PY3]——环境配置(2)——windows下安装pycharm并连接Linux的python环境
    [转载+补充]windows下SVN客户端的安装
    [Visual studio code 常见问题解决] ——中文乱码、
    Smrty模版总结(转)
    cms内容模型标签
    phpcms图文总结(转)
    phpcms总结(转)
    PHP总结
  • 原文地址:https://www.cnblogs.com/superxuezhazha/p/6397803.html
Copyright © 2011-2022 走看看