list
- list的定义和结构
1)list的定义
- 模板定义: template <class T, class Allocator = std::allocator
> class list; - 使用频率: 在算法题中极少使用,通常用数组模拟链表或手写链表替代
- 底层结构: 双向链表,以节点(node)形式存储元素,通过指针链接形成链表结构
- 内存特性: 节点在内存中不连续存储,每个节点包含元素值和前后指针
- std::list
mylist; mylist.push_back(1); mylist.push_front(1);
2)list的特点
-
双向性: 每个节点包含指向前后节点的指针,支持
O(1)
时间复杂度的任意位置插入/删除
-
动态大小: 可动态扩展/收缩,无需预先指定容器大小
-
访问特性:
-
优点:插入删除效率高(
O(1)
)
-
缺点:随机访问效率低(O(n)),必须通过遍历访问
-
-
与vector对比:
- vector适合频繁随机访问
- list适合频繁插入删除
- vector内存连续,list内存不连续
3)应用案例
2. list的常用函数
![[Pasted image 20260407211324.png]]
1)front
- 功能: 返回首元素引用
- 特性: 可直接修改元素值myList.front() = x;
- 对比back: back()返回尾元素引用
2)begin与end
- 迭代器操作: 仅支持++/--逐步移动,不支持随机访问 ++ ++ begin()
- 特殊注意:
- begin()返回首元素迭代器
- end()返回末尾的下一个位置
- 与vector迭代器语法相似但底层实现不同
3)insert
-
插入位置: 在指定迭代器位置前插入
-
示例: insert(++myList.begin(), 0)在第二个位置插入0
-
时间复杂度:
O(1)
4)erase
- 删除方式:
- 单元素删除:erase(pos)
- 区间删除:erase(first, last)(左闭右开)
- 注意事项: 需确保迭代器有效性,避免操作空链表
3. 代码示例
- 初始化: 创建包含1-5的list
- 反转操作: reverse(myList.begin(), myList.end())变为5→4→3→2→1
- 插入操作: 在第二个位置插入0后为5→0→4→3→2→1
- 删除操作: erase(++++myList.begin(), --myList.end())删除第3到倒数第2个元素,最终为5→0→1
- 重要提醒:
- size()返回unsigned int类型,做减法时需类型转换 (int)size-1
- 所有操作需保证链表非空
- 迭代器失效规则与vector不同

浙公网安备 33010602011771号