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++; } }
运行结果: