STL 之 list 双向链表

list 介绍

list 是双向链表的一个泛化容器,它的数据元素可通过链表指针串接成逻辑意义上的线性表。不同于采用线性表顺序存储结构的vector 和 deque 容器,list 双向链表中任一位置的元素插入删除,都具有高效的常数阶算法时间复杂度 O(1)。查询效率低。

list 函数
创建 list 对象
  • list (),构造函数是 list (const A &a = A()) 的默认调用方式
    • 例如:list<int> l;
  • list (size_type n)
    • 例如:list <int> l(10);  
      • // 构造含有10个 int 元素链表 l,初始值为0.
  • list (size_type n, const T& value)
    • 例如:list <double> l(10, 9.3);  
      • // 构造含有10个 double 元素的链表l,初始值为9.3。
  • list (list const list&),拷贝函数
    • 例如:list<double> l2(l);
  • list (InputIterator first, InputInterator last)  // 拷贝区间为[first, end)
    • 例如:int iArray[] = {11, 22, 33};
    • list<int> l(iArray, iArray+3);
元素的遍历访问
不能使用"[]",只能用迭代器。
  • 元素的正向遍历
    • iterator begin()
    • iterator end()
    • 例如:
      • list<int>::iterator i, iend;
      • iend = v.end(); 
      • for (i = v.begin(), j = 0; i != iend; i++, j++)
      •     cout << "[" << j << "]= " << *i << endl;
  • 元素的反向遍历
    • reverse_iterator rbegin ()
    • reverse_iterator rend ()
      • 使用方法,同上面
元素的插入
  • void push_front (const T& x)
    • 在链表首位插入
  • void push_back (const T&);
    • 在链表尾部插入,例如:l.push_back(44);
  • iterator insert (iterator pos, const T& x)
    • 在第 pos 个位置插入
元素的删除
  • void pop_front ()
    • 删除第一个元素
  • void pop_back ()
    • 删除最后一个元素
  • iterator erase (iterator pos)
    • 删除第 pos 个元素
  • iterator erase (iterator first, iterator last)
    • 删除区间 [first, last) 的元素
  • void clear ()
    • 删除所有元素
  • void remove (const T& value)
    • 删除等于 value 的所有元素
  • remove_if(bool Function(T& element)) 
    • 该函数的参数是一个函数,是一个返回值为bool,参数为元素类型的一个函数
    • 删除条件满足的元素 (会遍历一遍链表)
list 的交换
  • void swap (list &)
list 的合并
  • void splice (iterator position, list &x)
    • 把链表 x 插入到当前链表的 position 位置,list 对象 x 将被清空
  • void splice (iterator position, list &, iterator i)
    • 将另一个链表从 i 开始的值插入到当前 list 链表中 position,将被插入的元素从原链表中删除
  • void splice (iterator position, list &, iterator ibegin, iterator iend)
    • 将另一个链表从 ibegin 开始到 iend 之前的值插入到当前 list 链表中 position,将被插入的元素从原链表中删除
  • void merge (list &x)
    • 将 list 对象 x 的链表归并到当前 list 链表中,并清空 x 的链表
    • 归并的时候,按照当前元素一个一个比较并复制到当前的链表中
list 元素处理
  • l.sort ()
    • 对链表 l 进行归并排序,例如:
      • c1.sort();  // 默认从小到大
      • c1.sort(great<int>());  // 从大到小
  • l. unique()

    • 对链表 l 进行剔除连续的元素,例如:
      • l 之前:6 8 6 6 6 9 13 6
      • 调用 unique() 之后: 6 8 6 9 13 6
  • l.unique(bool Function(T& item1, T& item2))  // 自己编写比较函数
list 的其他函数
  • assign() :重新分配值
    • void assign ( size_type n, const T& u );  // 重置链表为含 n 个元素,初始值都为 u
    • void assign ( InputIterator first, InputIterator last );  // 重置链表为区间 [first, last)
  • front ():返回第一个元素的引用
  • back ():返回最后一元素的引用
  • begin ():返回第一个元素的指针(iterator)
  • end ():返回最后一个元素的下一位置的指针
  • size ():获取链表的长度
  • resize ():改变链表的长度
  • reverse ():反转链表
参考文章

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值