zoukankan      html  css  js  c++  java
  • STL list 的insert()和erase()

    list 类提供了insert(),erase()函数,它们分别增加和删除一个位于迭代器位置的元素。

    1,  insert()

    iterator  insert(iterator pos,const T &vaule);
    //在pos前插入vaule,返回新元素的迭代器,不影响现有迭代器。

    #include<iostream>
    using namespace std;
    #include<list>
    int main(void)
    {
        int a[5]={1,2,3,4,5};
        list<int> intList(a,a+5);
        list<int>::iterator iter,newIter;
        iter=intList.begin();
        newIter=intList.insert(iter,0);
        cout<<"newIter指向:"<<*newIter<<endl;
        cout<<"iter指向:"<<*iter<<endl;
        getchar();
    }

    运行结果:

    在表的首元素插入数据元素0,newIter指向新插入的0,iter还是指向原来的1

    2,  erase()

    void erase(iterator pos);
    //删除pos指向的元素,删除后pos指向未知

    #include<iostream>
    using namespace std;
    #include<list>
    int main(void)
    {
        int a[5]={1,2,3,4,5};
        list<int> intList(a,a+5);
        list<int>::iterator iter,newIter;
        iter=intList.begin();
        intList.erase(iter);
        cout<<"iter指向:"<<*iter<<endl;//会报运行时错误
        getchar();
    }

    运行结果:

    删除表的首元素,表少了一个元素,但是iter却指向了未知,这不是我们期望的!

    故我们可以使用

    erase(iter++) 代替 erase(iter)

    erase(iter++)相当于把迭代器当前的值给erase的参数,同时又将迭代器iter指向下一个元素。

    #include<iostream>
    using namespace std;
    #include<list>
    int main(void)
    {
        int a[5]={1,2,3,4,5};
        list<int> intList(a,a+5);
        list<int>::iterator iter,newIter;
        iter=intList.begin();
        intList.erase(iter++);
        cout<<"iter指向:"<<*iter<<endl;//会报运行时错误
        getchar();
    }

    运行结果:

    3, insert()和erase()使用

    /*
    原始数组: 1 2 3 4 5
    期望输出1:1 1 2 2 3 3 4 4 5 5
    期望输出2:3 3 4 4 5 5
    
    函数 doubleData()使用insert()实现数据元素重复
    函数 eraseSmallVaule()使用erase()实现删除比3小的数据元素
    函数 print()遍历list,输出list的信息
    */
    
    #include<iostream>
    using namespace std;
    #include<list>
    template<typename T>
    void print( list<T> &alist);
    template<typename T>
    void doubleData(list<T> &alist);
    template<typename T>
    void eraseSmallVaule(list<T> &alist,T  vaule);
    int main(void)
    {
        int a[5]={1,2,3,4,5};
        list<int> intList(a,a+5);
        cout<<"原始list是:";
        print(intList);
    
        doubleData(intList);
        cout<<"doubleData()后list是:";
        print(intList);
        cout<<"删除比3小的元素后list是:";
        eraseSmallVaule(intList,3);
        print(intList);
        getchar();
    }
    template<typename T>
    void print( list<T> &alist)
    {
        list<T>::iterator iter;
        iter=alist.begin();
        while(iter!=alist.end())
        {
            cout<<*iter<<" ";
            iter++;
        }
        cout<<endl;
    }
    template<typename T>
    void doubleData(list<T> &alist)
    {
        list<T>::iterator iter,newIter;
        iter=alist.begin();
        while(iter!=alist.end())
        {
            newIter=alist.insert(iter,*iter);
            iter++;
        }
    }
    template<typename T>
    void eraseSmallVaule(list<T> &alist,T vaule)
    {
        list<T>::iterator iter;
        iter=alist.begin();
        while(iter!=alist.end())
        {
            if(*iter<vaule)
            {
                alist.erase(iter++);
            }
            else
                iter++;
        }
    }

    运行结果:

  • 相关阅读:
    协方差矩阵
    SLAM中的关键帧是什么?有什么用?如何选择关键帧?
    EKF算法与非线性优化算法的比较
    LC217 存在重复元素
    LC42 接雨水
    LC20 有效的括号
    LC3 无重复最长子串
    LC4 寻找两个有序数组的中位数
    ubuntu16.04下安装g2o
    小米 各版本手机系统包 线刷包 卡刷包
  • 原文地址:https://www.cnblogs.com/qianwen/p/3841201.html
Copyright © 2011-2022 走看看