C++ STL list 容器详解:使用与模拟实现
1. list 简介及使用
list 是 C++ STL 中基于双向循环链表实现的序列容器。与 vector 不同,它在任意位置插入和删除元素的复杂度均为 O(1),但不支持随机访问(即无法通过下标直接获取元素)。
1.1 构造方式
常见的构造函数包括默认构造、拷贝构造、区间构造以及指定数量初始化:
| 构造函数 | 说明 |
|---|---|
list(size_type n, const value_type& val) | 创建包含 n 个值为 val 的列表 |
list() | 创建空列表 |
list(const list& x) | 拷贝构造 |
list(InputIterator first, InputIterator last) | 用区间 [first, last) 的元素构造 |
1.2 迭代器操作
迭代器是对底层节点指针的封装,支持正向和反向遍历。
begin()/end():分别指向首元素和尾后位置。rbegin()/rend():反向迭代器,rbegin指向最后一个元素,rend指向第一个元素前。
注意:正向迭代器 ++ 向后移动,反向迭代器 ++ 向前移动。
1.3 容量与访问
empty():判断是否为空。size():返回有效节点个数。front()/back():获取首尾元素的引用。
1.4 修改操作
核心修改接口包括 push_front/back、pop_front/back、insert、erase、swap 和 clear。
1.5 迭代器失效规则
由于底层是双向循环链表,插入操作不会导致现有迭代器失效。只有在删除元素时,指向被删除节点的迭代器才会失效,其他迭代器依然有效。
处理删除时的常见错误写法如下:
while (it != l.end()) {
l.erase(it); // it 失效
++it; // 错误,it 已无效
}
正确做法是接收 erase 返回的下一个有效迭代器:
while (it != l.end()) {
if (condition) {
it = l.(it);
} {
++it;
}
}


