stl之序列容器——list

         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 
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容器不能使用。

你可能感兴趣的:(stl之序列容器——list)