list概述:
相较于vector的连续线性空间,list就有点复杂了,但复杂有复杂的好处,每次插入或删除一个元素,就配置或释放一个元素。因此list不存在浪费空间的问题。而且对于任何位置插入或释放元素,时间是常值。
list的迭代器
首先list的节点(node)是一个双向链表。另外list不能像vector以普通指针作为迭代器,因为其节点不保证在空间中连续。所以list的迭代器要能够指向list的节点,并且可以进行正确的递增、递减、取值和成员存取等操作。所以迭代器要有前移、后退的能力,所以list的迭代器为双向迭代器。
list有一个重要性质:插入操作和接合操作都不会造成list迭代器的失效。这是vector所不具有的。
所以说list迭代器的设计也是非长麻烦的
template<class T, class Ref, class Ptr>
struct __lisr_iterator{
一个普通指针,指向list节点
重载运算符 ==、=、*(对迭代器取节点值)等等,进行迭代器成员存取和迭代器的加减。
}
list数据结构
SGI list不仅是一个双向链表,还是一个环形链表,只需一个指针就可完整表现整个链表。让指针指向刻意置于尾端的空白点,node便可符合STL前开后闭的特点,完成last迭代器,因此轻易完成返回开始迭代器和最后面的迭代器。
list的构造和内存管理
list缺省使用alloc维空间配置器,有专属空间配置器,每次配置、释放、构造和销毁一个空间。
list元素的操作
list对于元素的操作有很多:
push_front()
push_back()
iterator erase()
pop_front()
pop_back()
clear() //清空所有节点
remove() //移除所有某个特定值
unique() //移除数值相同的连续元素
另外list内部有一个迁移操作(transfer):将连续范围的元素迁移到到某个特定位置之前,有了这个操作,可以为其他复杂的操作(splice(接合)、merge(合并,之前排过序),reverse(逆向重置))奠定良好的操作
list不能使用STL的算法sort(),必须自己的成员函数sort().采用快速排序。