list使用一个双向链表来管理元素。
使用list必须含入头文件<list>
#include<list>
list的能力:
list的内部结构和vector或deque截然不同,所以在几个主要方面与vector和deque存在明显区别:
1. list不支持随机存取。如果你要存取5个元素,就得顺着串链一一爬过前4个元素。所以在list中随机遍历任何元素,是很缓慢的行为。
2. 任何位置上(不止两端)执行元素的安插和移除都是非常快,始终都是常数时间内完成,因为无需移动任何其它元素。
3. 安插和删除动作并不会造成指向其它元素的各个指针、引用、迭代器失效。
4. list对于异常有着这样的处理方式:要么操作成功,要么什么都不要发生。
list所提供的成员函数反应出它和vector以及deque的不同:
1. 由于不支持随机存取,list既不提供下标操作符,也不提供at()
2. list并未提供容量、空间重新分配等操作函数,因为没有必要。每个元素都有自己的内存。
3. list提供不少特殊的成员函数,专门用于移动元素。
list提供的特殊成员函数(vector和deque没有)
c.remove(val) 移除所有其值为val的元素
c.remove_if(op) 移除所有造“造成op(elem)结果为ture”的元素
c.unique() 如果存在若干相邻而数值相等的元素,就移除重复元素,只留下一个
c.unique(op) 如果存在若干相邻元素,都是op()的结果为true,则移除重复元素,只留下一个
c1.splice(pos , c2) 将c2内所有元素转移到c1之内、迭代器pos之前
c1.splice(pos , c2 , c2pos) 将c2内的c2pos所指元素转移到c1内的pos所指位置上
c1.splice(pos , c2 , c2beg , c2end) 将c2内[c2beg,c2end]区间内所有元素转移到c1内的pos之前
c.sort(op) 以op()准则,对所有元素排序
c1.merge(c2) 假设c1和c2容器都包含已序元素,将c2的全部元素转移到c1,并保证合并后的list仍为已序。
c1.merge(c2 , op) 假设c1和c2都包含op()原则下的已序元素,将c2的全部元素转移到c1,并保证合并后list在op()原则下仍已序
c.reverse() 将所有元素反序
list实例:
#include<iostream>
#include<list>
#include<algorithm>
using namespace std;
void printLists(const list<int>& l1 ,const list<int> &l2)
{
cout<< “list1:”;
copy(l1.begin() , l1.end() ,ostream_iterator<int>(cout , “ ”));
cout<<endl<< “list2:”
copy(l1.begin() , l1.end() ,ostream_iterator<int>(cout , “ ”));
cout<<endl<<endl;
}
void main()
{
list<int> list1,list2;
for(int i=0;i<6;i++)
{
list1.push_back(i);
list2.push_front(i);
}
printLists(list1,list2);
list2.splice(find(list2.begin() , list2.end(),3),list1);
printLists(list1,list2);
list2.splice(list2.end() , list2 , list2.begin());
printLists(list1,list2);
list2.sort();
list1=list2;
list2.unique();
printLists(list1,list2);
list1.merge(list2);
printLists(list1,list2);
}
程序输出:
list1: 0 1 2 3 4 5
list2: 5 4 3 2 1 0
list1:
list2: 5 4 0 1 2 3 4 5 3 2 1 0
list1:
list2: 4 0 1 2 3 4 5 3 2 1 0 5
list1: 0 0 1 1 2 2 3 3 4 4 5 5
list2:0 1 2 3 4 5
list1: 0 0 0 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5
list2: