list基本用法
list使用一个双向链表来管理元素,每一个元素都知道前面一个元素和后面一个元素。
和vector不一样的是,list不支持对元素的任意存取。list中提供的成员函数与vector类似,不过list提供对表首元素的操作push_front、pop_front,这是vector不具备的。和vector另一点不同的是,list的迭代器不会存在失效的情况,他不像vector会保留备份空间,在超过容量额度时重新全部分配内存,导致迭代器失效;list没有备份空间的概念,出入一个元素就申请一个元素的空间,所以它的迭代器不会失效
使用list时必须包含头文件<list>:#include<list>
其中list类型是定义于namespace std中,是个class template:
namespace std
{
template <class T,class Allocator = allocator<T> >class list;
}
list的内部结构和vector或deque截然不同。list在以下几个主要方面与前两者存在明显区别: 1)list不支持随机存取。如果要存取第5个元素,就得遍历前4个元素。所以,在list中随机遍历任意元素,是很缓慢的行为。
2)任何位置上(不只是两端)执行元素的插入和删除都非常快,始终都是常数时间内完成,因为无需移动任何其他元素。实际上内部只是进行了一些指针操作而已。
3)插入和删除动作并不会造成指向其他元素的各个指针、引用、迭代器失效。
4)list对于异常有着这样的处理方式:如果操作不成功,将不会对list中数据进行任何操作。决不会陷入“只成功一半”的状态。
list所提供的成员函数反映出它和vector以及deque的不同:
1)由于不支持随机存取,list既不提供下标运算符,也不提供at()。
2)list并未提供容量、空间重新分配等操作函数,因为全无必要。每个元素都有自己的内存,在被删除之前一直有效。
3)list提供了不少特殊的成员函数,专门用于移动元素。较之同名的STL通用算法,这些函数执行起来更快,因为它们无需拷贝或移动,只需调整若干指标即可。
list不支持随机存取,只有front()和back()能够直接存取元素
由于list不能随机存取,这些迭代器只是双向(而非随机)迭代器。所以凡是用到随机存取迭代器的算法(所有用来操作元素顺序的算法,特别是排序算法都归此类)都不能调用。不过可以拿list的特殊成员函数sort()代替。
#include <iostream> #include <list> //需要包含头文件 #include <algorithm> using namespace std; int main() { list<int>Mylist1; //产生一个空的list for (int i=0;i<5;i++) { Mylist1.push_back(i); //在尾部添加元素 Mylist1.push_front(i); //在头部添加元素 } /* empty(),size(),max_size(),assign(n,elem),front(),back(),insert(pos,elem) remove(val),erase(pos),resize(num),clear()等基本于vector一致 */ list<int>::iterator ita; //迭代器 int i=0; for (i=0,ita=Mylist1.begin();ita!=Mylist1.end();i++,ita++) //遍历list { cout<<"Mylist1第"<<i<<"个元素是:"<<*ita<<endl; } cout<<endl; list<int>Mylist2(Mylist1); //产生一个和Mylist1一样的list(每个元素都被复制) Mylist2.pop_back(); //删除最后一个元素 Mylist2.pop_front(); //删除第一个元素 for (i=0,ita=Mylist2.begin();ita!=Mylist2.end();i++,ita++) //遍历list { cout<<"Mylist2第"<<i<<"个元素是:"<<*ita<<endl; } //使用STL中的max_element算法来求Mylist2的最大值,需包含#include <algorithm> list<int>::iterator Mylist2Max=max_element(Mylist2.begin(),Mylist2.end()); cout<<"Mylist2最大值:"<<*Mylist2Max<<endl; cout<<endl; list<int>Mylist3(10); //产生一个包含10个元素的list,并且每个元素都是默认构造函数初始化 for (i=0,ita=Mylist3.begin();ita!=Mylist3.end();i++,ita++) //遍历list { cout<<"Mylist3第"<<i<<"个元素是:"<<*ita<<endl; } cout<<endl; Mylist2.swap(Mylist3); //互换 //swap(Mylist2,Mylist3); //互换 Mylist3.unique(); //如果存在相邻而元素相同的值,就删除重复的元素,只留下一个 for (i=0,ita=Mylist3.begin();ita!=Mylist3.end();i++,ita++) //遍历list { cout<<"Mylist3第"<<i<<"个元素是:"<<*ita<<endl; } cout<<endl; Mylist2.splice(++Mylist2.begin(),Mylist3); //将Mylist3的所有元素转移到Mylist2内,在迭代器++Mylist2.begin()前 //类似的还有 //c1.splice(pos,c2,c2pos);是将c2内的c2pos所指元素转移到c1的pos位置上 //c1.splice(pos,c2,c2beg,c2end);是将c2内的c2beg到c2end所指元素转移到c1的pos位置上 for (i=0,ita=Mylist2.begin();ita!=Mylist2.end();i++,ita++) //遍历list { cout<<"Mylist2第"<<i<<"个元素是:"<<*ita<<endl; } cout<<endl; //如果想让一个list内没有重复的元素就可以先使用排序,然后在使用unique Mylist2.sort(); Mylist2.unique(); for (i=0,ita=Mylist2.begin();ita!=Mylist2.end();i++,ita++) //遍历list { cout<<"Mylist2第"<<i<<"个元素是:"<<*ita<<endl; } cout<<endl; Mylist1.sort(); Mylist1.merge(Mylist2); //如果Mylist1,Mylist2是已排序元素,将Mylist2转移到Mylist1,合并后list仍然有序 for (i=0,ita=Mylist1.begin();ita!=Mylist1.end();i++,ita++) //遍历list { cout<<"Mylist1第"<<i<<"个元素是:"<<*ita<<endl; } cout<<endl; Mylist1.reverse();//将元素反序 for (i=0,ita=Mylist1.begin();ita!=Mylist1.end();i++,ita++) //遍历list { cout<<"Mylist1第"<<i<<"个元素是:"<<*ita<<endl; } cout<<endl; system("pause"); return 0; }