在STL中list表示的是一种环状的双向链表(带头) ,相比vector需要维护start finish end_of_storage,list只需要维护一个node指针结点(头结点)就可以了。
双向环状链表的初始过程如下:
1 node=getNode();//新建一个结点
2 node->next=node;//后一结点是node
3 node->pre=node;//前一结点是node
特点:1)环状双向链表,对于任何位置的元素插入或删除是常数时间
2)插入和接合不会使原有list迭代器失效
list迭代器:不能以普通指针为迭代器,使用bidirectional iterator
插入操作:本质是插入在…之前,新节点位于标示出插入点所指节点的前方,插入前的所有迭代器在插入后有效
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那样只是某种移动而已)
- list<int> list1;
- list1.remove(val);
#include<iostream>
#include<list>
#include<algorithm>
#include<iterator>
using namespace std;
void printList(const list<int> &list1,const list<int> &list2)
{
cout<<"list1:";
copy(list1.begin(),list1.end(),ostream_iterator<int>(cout," "));
cout<<endl<<"list2:";
copy(list2.begin(),list2.end(),ostream_iterator<int>(cout," "));
cout<<endl<<endl;
}
int main(int argc,char *argv[])
{
list<int> list1,list2;
for(int i=10;i<20;i++)
{
list1.push_back(i);
list2.push_front(i);
}
printList(list1,list2);
list2.splice(list2.end(),list2,list2.begin());
printList(list1,list2);
list2.sort();
printList(list1,list2);
list2.unique();
printList(list1,list2);
list1.merge(list2);
printList(list1,list2);
return 0;
}
shenhuayu@shenhuayu-VirtualBox ~/src $ g++ stltest.cpp -g -o mystltest
shenhuayu@shenhuayu-VirtualBox ~/src $ ./mystltest
list1:10 11 12 13 14 15 16 17 18 19
list2:19 18 17 16 15 14 13 12 11 10
list1:10 11 12 13 14 15 16 17 18 19
list2:18 17 16 15 14 13 12 11 10 19
list1:10 11 12 13 14 15 16 17 18 19
list2:10 11 12 13 14 15 16 17 18 19
list1:10 11 12 13 14 15 16 17 18 19
list2:10 11 12 13 14 15 16 17 18 19
list1:10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 19 19
list2: