list是一个双向链表,其内部维护了一个node节点(只要一个指针,便可以表示整个环状双向链表),提供了Bidirectional Iterators,可支持++与—操作。
list有个重要性质:插入操作(insert)和接合操作(splice)都不会造成原有的list迭代器失效。list的删除操作也只有“指向被删除元素”的那个迭代器失效,其他迭代器不受任何影响
一些元素操作如下:
push_front
push_back
pop_front
pop_back
remove //移除节点值=value的所有节点
unique //移除数值相同的连续元素
erase //会析构并销毁一个节点,与vector不同,vector只析构但不销毁
clear //清空所有节点(会析构和销毁)
transfer //将某连续范围的元素迁移到某个特定位置之前,是splice、merge、reverse、sort的基础
splice //将源list的内容部分或全部元素删除,拼插入到目的list
merge //合并两个list,前提是两个lists的内容都必须经过递增排序
sort //排序,使用了merge sort,其源码如下
template <class _Tp, class _Alloc>
void list<_Tp, _Alloc>::sort()
{
//Do nothing if the list has length 0 or 1.
if(_M_node->_M_next != _M_node && _M_node->_M_next->_M_next !=_M_node) {
list<_Tp, _Alloc> __carry;
list<_Tp, _Alloc> __counter[64];
int __fill = 0;
while (!empty()) {
__carry.splice(__carry.begin(), *this, begin());
int __i = 0;
while(__i < __fill && !__counter[__i].empty()) {
__counter[__i].merge(__carry);
__carry.swap(__counter[__i++]);
}
__carry.swap(__counter[__i]);
if (__i == __fill) ++__fill;
}
for (int __i = 1; __i < __fill; ++__i)
__counter[__i].merge(__counter[__i-1]);
swap(__counter[__fill-1]);
}
}
从源码中可看出,list的sort算法最多可以支持2^64个元素排序
reverse //翻转
size //调用distance函数计算链表长度
insert //在给定位置之前插入元素
tips: 对于常用的排序操作,请调用list自身的sort方法。stl中通用的sort方法针对的是RandomAccess Iterator,list容器不能使用。