list的结点

泛读《STL源码剖析》第四章:序列式容器之list源码

list的迭代器

迭代器类型是Bidirectional Iterators

迭代器设计:内部是一个普通指针,但重载各种操作符号

泛读《STL源码剖析》第四章:序列式容器之list源码

泛读《STL源码剖析》第四章:序列式容器之list源码

list的数据结构

泛读《STL源码剖析》第四章:序列式容器之list源码

node刻意指向尾端的空白节点,node便符合STL中“前闭后开”的要求,成为last迭代器

如此,begin( ),end( ),empty( ),front( ),back( )函数便可轻易实现

泛读《STL源码剖析》第四章:序列式容器之list源码

list示意图

泛读《STL源码剖析》第四章:序列式容器之list源码

 

list的构造与内存管理:constructor, push_back, insert

list 预 设 使 用 alloc 做 为 空 间 配 置 器 , 并 据 此 另 外 定 义 了 一 个 list_node_allocator,为的是更方便以节点大小为配置单位:

泛读《STL源码剖析》第四章:序列式容器之list源码

 

list_node_allocator(n) 表示配置 n 个节点空间。以下4个函数,分别用来配置、释放、建构、摧毁一个节点:

泛读《STL源码剖析》第四章:序列式容器之list源码

 

list 提供有许多 constructors,其中一个是 default constructor,允许我们不指定任何参数做出一个空的 list 出来,目的是为了空list的初始化

泛读《STL源码剖析》第四章:序列式容器之list源码

empty list 图示

泛读《STL源码剖析》第四章:序列式容器之list源码

 

下面是insert的一个实现版本

泛读《STL源码剖析》第四章:序列式容器之list源码

基于此insert,就刻意实现list的push_back

泛读《STL源码剖析》第四章:序列式容器之list源码

由于 list 不像 vector 那样有可能在空间不足时做重新配置、数据搬移的动作,所以安插前的所有迭代器在安插动作之后都仍然有效

 

list 的元素操作:

push_front, push_back, erase, pop_front, pop_back,
clear, remove, unique, splice, merge, reverse, sort

push_front( )

泛读《STL源码剖析》第四章:序列式容器之list源码

push_back( )

泛读《STL源码剖析》第四章:序列式容器之list源码

erase( )

泛读《STL源码剖析》第四章:序列式容器之list源码

pop_front( )

泛读《STL源码剖析》第四章:序列式容器之list源码

pop_back( )

泛读《STL源码剖析》第四章:序列式容器之list源码
clear( )

泛读《STL源码剖析》第四章:序列式容器之list源码

remove( )

泛读《STL源码剖析》第四章:序列式容器之list源码

unique( )

泛读《STL源码剖析》第四章:序列式容器之list源码

泛读《STL源码剖析》第四章:序列式容器之list源码

在介绍splice、 merge、 reverse、 sort之前,先介绍transfer函数

list 内部提供一个所谓的迁移动作(transfer):将某连续范围的元素迁移到某个特定位置之前

泛读《STL源码剖析》第四章:序列式容器之list源码

以上七个动作,显示于下图

泛读《STL源码剖析》第四章:序列式容器之list源码

transfer 所接受的 [first,last) 区间,可以在同一个 list 之中

splice( ) (为提供各种版本弹性,有多个版本)

泛读《STL源码剖析》第四章:序列式容器之list源码

merge( )

泛读《STL源码剖析》第四章:序列式容器之list源码

reverse( )

泛读《STL源码剖析》第四章:序列式容器之list源码

sort( )

泛读《STL源码剖析》第四章:序列式容器之list源码

 

end

 

 

 

相关文章: