List 就是链表,这个我们在很久之前就学习过了单向链表,双向链表。之前对STL有过大概的剖析,但没涉及到链表,早几天使用到了STL中的,对其中的有些细节不明了,特意重新阅读了下源码,对STL中的List 加深一下理解。。。。论指针(地址)的重要性。
附带说一句,阅读源码,建议使用Source Insight,非常好的源码阅读工具,没有其二。
1、List 概述
list 和 vector 是两个最常用的容器(序列式容器)。二者最显著的区别自然就是vector是连续线性空间,list则是不连续线性空间,相比于vector(动态数组),它的好处是每次插入和删除一个元素,只需配置或释放一个元素空间,对于任何位置的元素插入或元素移除,list永远是常数时间。尺有所长,寸有所短,list 寻址某一元素也没有vector(常数时间)方便。那么什么时机下最适合使用哪一种容器呢?必须视元素的多寡,元素的构造复杂度,元素存取行为的特定而定。
2、list 的节点
侯捷先生剖析的是STL203版的源码,我们这里紧跟下时尚,来剖析最新的STL源码http://www.sgi.com/tech/stl/download.html
以下是STL list的节点结构:
1 | struct _List_node_base { |
显然这是一个双向链表,链表节点的数据部分单独的放在一个结构体中,然后通过继承来获得链表的先后指针。node_base中仅含指针,这赶脚有点类似于linux内核中的list。