首页 > 代码库 > STL list 的insert()和erase()

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

运行结果: