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++;
        }
    }

    运行结果:

  • 相关阅读:
    python025 Python3 正则表达式
    python024 Python3 实例
    python023 Python3 标准库概览
    python022 Python3 面向对象
    python021 Python3 错误和异常
    列表和元组的元素不可被修改,但列表和元组的元素的元素可以被修改
    织梦标签
    自动添加QQ
    php把时间存入数据库为年月日时分秒类型
    PHP后台批量删除数据
  • 原文地址:https://www.cnblogs.com/qianwen/p/3841201.html
Copyright © 2011-2022 走看看