STL 容器list(江南烟雨)

来源:互联网 发布:知乎好玩的话题怎么找 编辑:程序博客网 时间:2024/04/28 02:42

一、list基础

List使用一个双向链表来管理元素。图一显示了list的结构。


图一 list的结构

任何型别只要具备赋值和可拷贝两种性质,就可以作为list的元素。


二、list的功能

list的内部结构和vector和deque截然不同,在很多方面都表现不同:

1、list不支持随机存取。所及既不提供下表操作符,也不提供at()函数。

2、任何位置上插入元素删除元素都很快。

3、插入和删除操作不会造成指向其他元素的pointers、references、iterators失效。

4、list对于异常的处理方式是:要么成功,要么什么都不发生。

5、不提供容量、空间重新分配等操作函数。

6、提供了一些函数专门用于移动元素。


三、list的操作函数

生成、赋值和销毁与序列式容器相同。

构造函数和析构函数:


非变动性操作


赋值


元素存取


一般来说,这些操作不会检查元素是否为空,所以程序员必须保证容器不为空。

迭代器相关函数

存取元素只能用迭代器。然而由于list不能随机存取,这些迭代器只是双向而非随机迭代器。所以凡是用到随机存取迭代器的算法(所有用来操作元素顺序的算法-特别是排序算法都归于此类)都不能调用。不过可以用list的成员函数sort()完成此功能。


元素的插入和删除



list提供deque的多余功能,还增加了remove()和remove_if()算法应用于list‘身上的特殊版本。这些成员函数比STL的remove算法更快,因为它们只进行内部指目标工作,无需估计元素。

要将所有与某值相等的元素删除,可以用如下语句(注意:确实是将这些元素删除了,而不是像vector那样只是某种移动而已)

[cpp] view plaincopyprint?
  1. list<int> list1;  
  2. list1.remove(val);  
list还提供了其他一些成员函数,用来改变元素和区间的次序,或是重新串链。我们可以用他们来移动单一list里的元素,也可以移动两个list之间的元素(前提是list的型别一致)。



四、list的异常处理

在所有的STL标准容器中,list提供了最佳支持。几乎所有的操作都是要么正确,要么什么都不发生。只有少数几个操作没有这样的保证:赋值和sort()。不过他们也不会泄露资源,也不会与容器的恒常特性发生冲突。merge(),remove(),remove_if(),unique()提供的保证是有前提的L就是元素间的比较动作不会抛出异常。


五、list示例程序

[cpp] view plaincopyprint?
  1. #include <iostream>  
  2. #include <list>  
  3. #include <algorithm>  
  4. using namespace std;  
  5.   
  6. void outputLists(const list<int> &l1,const list<int> &l2)  
  7. {  
  8.     cout << "list1:";  
  9.     copy(l1.begin(),l1.end(),ostream_iterator<int>(cout," "));  
  10.     cout << endl << "list2:";  
  11.     copy(l2.begin(),l2.end(),ostream_iterator<int>(cout," "));  
  12.     cout << endl << endl;  
  13. }  
  14.   
  15. int main()  
  16. {  
  17.     list<int> iList1,iList2,iList3;  
  18.   
  19.     for (int i = 1;i < 9;++i)  
  20.     {  
  21.         iList1.push_back(i);  
  22.         iList2.push_front(i);  
  23.         iList3.push_front(i);  
  24.     }  
  25.   
  26.     outputLists(iList1,iList2);  
  27.   
  28.     iList2.splice(iList2.end(),iList2,iList2.begin());  
  29.     outputLists(iList1,iList2);  
  30.   
  31.     iList2.sort();  
  32.     outputLists(iList1,iList2);  
  33.   
  34.     iList2.unique();  
  35.     outputLists(iList1,iList2);  
  36.   
  37.     iList1.merge(iList2);  
  38.     outputLists(iList1,iList2);  
  39.   
  40.     /*outputLists(iList3,iList1); 
  41.     iList1.merge(iList3); 
  42.     outputLists(iList3,iList1);*/  
  43. }  
运行结果:

注意:merge只使用与合并两个元素已序(而且都是升序)排列的的容器。如上面的程序,最后merge ilist1和ilist3程序就会报错。

0 0
原创粉丝点击