STL总结之list
STL中list和我们传统意义上的链表一样可以进行动态节点添加和释放.
优点:适合动态删除和添加
缺点:不支持随机访问.
C++标准对list模板声明:
template < class T, class Allocator = allocator< T> > class list;
1)list的构造有多种方式和vector差不多,如下:
list<int > first;
list<int > second(4,100);
list<int > third( second.begin (),second. end());
list<int > fourth( third);
int myints [] = {16,2,77,29};
list<int > fifth ( myints, myints + sizeof( myints) / sizeof (int) );
2)list的内存分配方式(以vs2008中为例).
list不管以什么方式初始化,它总是会先分配一个头节点,节点内容为空, 并且头结点的前一个节点指向最后一个节点, 最后一个节点指向头节点.
以后不管是以insert, push_back, push_front插入数据,list都会使用std::allocator<T>分配器进行重新内存分配.
进行pop_front, pop_back, erase, clear, resize, assign删除的节点内存都会被释放掉.这和vector不太一样.
3)list成员函数splice是从一个list中移动元素到另一list中;
程序1:
![](http://images0.cnblogs.com/blog/339657/201310/07210703-4d210cd5dace44c7bc56565cb33b2c19.png)
输出:
![](http://images0.cnblogs.com/blog/339657/201310/07210714-ea2cbe8bf4aa4d7086b1819b3d23168f.png)
splice操作是将一个list的中的元素直接拼接到另一list中,并不会重新申请释放内存.
4)list成员函数sort是将list中的元素进行排序(默认为升序),允许用户自定义比较规则.
在vs下我们看到排序使用了非递归的归并排序,使用了一个数组来保存中间序列最后遍历整个数组,将所有序列合并.
![](http://images0.cnblogs.com/blog/339657/201310/07210726-9db80ddc2f4c4d309786ddd4b5b3c5a1.png)
5)list成员函数reverse是对list进行翻转.成员函数unique只能去除相邻的相同元素, 因此如果要去除相同元素最好保证list有序.
6)由于list适合添加和删除元素,list提供了remove和remove_if函数移除指定的元素.
程序:
![](http://images0.cnblogs.com/blog/339657/201310/07210737-b011ae89055a483594b3b70b724e3b8c.png)
输出:
![](http://images0.cnblogs.com/blog/339657/201310/07210743-959dcd3dfdf642d5b113dc8c96b91c3e.png)
总结:容器list适合频繁添加和删除元素情况.