
对于熟悉 C++ 模板和 STL 日常使用,且对内存分配与对象生命周期有深入理解的开发者来说,阅读 STL 源码是提升底层能力的必经之路。本文基于 SGI STL 版本,深入剖析 std::list 的底层机制。
list 概述
相比 vector,list 的优势在于头插、头删及任意位置插入删除均可达到 O(1) 复杂度。由于节点非连续存储,它不会像 vector 那样发生扩容导致的迭代器失效问题(除非显式删除节点),且内存按需开辟。
当然,代价也是明显的:无法随机访问(无 [] 重载)、内存局部性差导致缓存命中率低,以及每个节点需额外存储两个指针带来的空间开销。
list 的节点设计
list 的节点与容器本身分离设计。节点结构体包含前后指针及数据域,直观体现了双向链表特性。
template <class T>
struct __list_node {
typedef void* void_pointer;
void_pointer next; // 下一个节点地址
void_pointer prev; // 上一个节点地址
T data; // 有效数据
};
list 迭代器详解
定义与构造
由于节点不连续,普通指针无法满足跳跃需求,因此 list 迭代器被定义为双向迭代器(Bidirectional Iterator)。其核心成员仅有一个指向当前节点的指针。
template <class T, class Ref, class Ptr>
struct __list_iterator {
typedef __list_iterator<T, T&, T*> iterator;
typedef __list_iterator<T, const T&, const T*> const_iterator;
typedef __list_iterator<T, Ref, Ptr> self;
typedef T value_type;
typedef Ptr pointer;
Ref reference;
__list_node<T>* link_type;
size_type;
difference_type;
link_type node;
};


