现在的位置: 首页 > 综合 > 正文

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

2018年02月21日 ⁄ 综合 ⁄ 共 2013字 ⁄ 字号 评论关闭

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:

 

抱歉!评论已关闭.