C++ STL list 容器详解:使用与模拟实现
list 的介绍及使用
list 是 C++ STL 中基于双向循环链表实现的序列容器。与 vector 不同,它在任意位置插入和删除元素的时间复杂度均为 O(1),但牺牲了随机访问能力(不支持下标直接访问)。这种特性使其在处理频繁中间插入删除的场景下更具优势。
构造函数
list 提供了多种初始化方式,包括默认构造、拷贝构造、区间构造以及指定数量元素的构造。
| 构造函数 | 说明 |
|---|---|
list(size_type n, const value_type& val) | 构造包含 n 个值为 val 的元素 |
list() | 构造空 list |
list(const list& x) | 拷贝构造 |
list(InputIterator first, InputIterator last) | 用区间 [first, last) 中的元素构造 |
迭代器操作
迭代器本质上是指向节点的指针封装。
begin()/end():正向遍历,指向首元素和尾后位置。rbegin()/rend():反向遍历,指向尾元素和首前位置。
注意正向迭代器 ++ 向后移动,反向迭代器 ++ 向前移动。
容量与访问
empty()/size():判断是否为空或获取元素个数。front()/back():快速访问首尾元素引用。
修改操作
提供丰富的增删改查接口:
push_front/push_back:头尾插入。pop_front/pop_back:头尾删除。insert/erase:指定位置插入或删除。swap/clear:交换内容或清空。
迭代器失效规则
由于底层是双向循环链表,插入操作不会导致现有迭代器失效。只有在删除元素时,指向被删除节点的迭代器才会失效,其他迭代器依然有效。
错误的删除写法示例:
while (it != l.end()) {
l.erase(it); // it 失效
++it; // 错误,it 已无效
}
正确做法应接收 erase 返回的下一个有效迭代器。
list 的模拟实现
为了深入理解 list 的机制,我们尝试手动实现一个简化版本。
节点结构设计
每个节点需要存储数据及前后指针。


