《STL源码剖析》-序列式容器(二)list容器

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().采用快速排序。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值