读书人

c\c++温习基础要点14-容器list

发布时间: 2013-10-07 19:41:22 作者: rapoo

c\c++复习基础要点14----容器list

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:

读书人网 >C++

热点推荐