- C++
C++ STL list
- @ 2026-4-4 18:45:16
C++ STL list 超详细教程(新手友好)
std::list 是 C++ STL 标准库中的双向链表容器,专门用于频繁插入、删除元素的场景,是编程中最常用的容器之一。
我会用最通俗的语言,带你从零学会 list 的所有核心用法,直接复制就能运行!
一、list 是什么?
- 本质:双向循环链表
- 优点:
- 在任意位置插入/删除元素极快(时间复杂度 O(1))
- 插入删除不会导致迭代器失效
- 不需要提前分配空间,无容量限制
- 缺点:
- 不支持随机访问(不能用
list[i]直接访问第 i 个元素) - 比 vector 占用更多内存
- 不支持随机访问(不能用
- 适用场景:需要频繁在中间增删元素、不在乎随机访问
二、头文件与命名空间
使用 list 必须包含头文件:
#include <list> // 必须
using namespace std; // 简化代码,新手推荐
三、创建 list 对象
1. 空 list
list<int> lst; // 创建一个空的 int 类型链表
2. 指定大小的 list
list<int> lst(5); // 5 个元素,默认值为 0
3. 指定大小 + 初始值
list<int> lst(5, 10); // 5 个 10
4. 用数组/其他容器初始化
int arr[] = {1,2,3,4,5};
list<int> lst(arr, arr + 5); // 用数组初始化
5. 拷贝初始化
list<int> lst1 = {1,2,3};
list<int> lst2(lst1); // 拷贝 lst1
四、最常用:增删改查
✅ 1. 添加元素
list<int> lst;
// 尾部添加
lst.push_back(10);
lst.emplace_back(20); // 效率更高,推荐
// 头部添加
lst.push_front(5);
lst.emplace_front(1);
// 指定位置插入(必须用迭代器)
auto it = lst.begin();
++it; // 指向第二个位置
lst.insert(it, 8); // 在第二个位置插入 8
✅ 2. 删除元素
// 删除尾部
lst.pop_back();
// 删除头部
lst.pop_front();
// 删除指定位置元素
lst.erase(lst.begin());
// 删除所有值为 x 的元素
lst.remove(8);
// 清空整个 list
lst.clear();
✅ 3. 访问元素
list 不支持 [] 访问!
// 访问第一个元素
lst.front();
// 访问最后一个元素
lst.back();
✅ 4. 遍历元素(必须用迭代器 / 范围for)
// 方法1:范围for(最简单,推荐)
for (int num : lst) {
cout << num << " ";
}
// 方法2:迭代器
for (auto it = lst.begin(); it != lst.end(); ++it) {
cout << *it << " ";
}
✅ 5. 大小与判空
lst.size(); // 获取元素个数
lst.empty(); // 判断是否为空,空返回 true
五、list 高级实用功能
1. 排序(sort)
list 自带高效排序,不用写算法:
lst.sort(); // 默认升序
lst.sort(greater<int>()); // 降序
2. 去重(unique)
删除连续重复元素(先排序再去重效果最好):
lst.sort();
lst.unique();
3. 反转(reverse)
lst.reverse(); // 1 2 3 → 3 2 1
4. 拼接(splice)
把另一个 list 的元素移动过来,不拷贝、效率极高:
list<int> a = {1,2};
list<int> b = {3,4};
a.splice(a.end(), b); // a 变成 1 2 3 4,b 变空
5. 交换两个 list
a.swap(b);
六、完整可运行示例
#include <iostream>
#include <list>
using namespace std;
int main() {
// 1. 创建并初始化
list<int> lst = {5, 2, 9, 1, 5, 6};
// 2. 遍历
cout << "初始:";
for (int n : lst) cout << n << " ";
cout << endl;
// 3. 增删
lst.push_back(10);
lst.push_front(0);
lst.remove(5); // 删除所有 5
// 4. 排序 + 去重 + 反转
lst.sort();
lst.unique();
lst.reverse();
// 5. 最终遍历
cout << "处理后:";
for (int n : lst) cout << n << " ";
cout << endl;
return 0;
}
输出:
初始:5 2 9 1 5 6
处理后:10 9 6 2 1 0
七、list vs vector(必看)
| 特性 | vector(动态数组) | list(双向链表) |
|---|---|---|
| 访问速度 | 快,支持 [] 随机访问 |
慢,只能迭代器遍历 |
| 插入/删除 | 中间慢,头尾快 | 任意位置都极快 |
| 内存占用 | 小 | 较大 |
| 迭代器失效 | 扩容时全部失效 | 只有被删节点失效 |
简单口诀:
- 查得多、不怎么增删 → 用 vector
- 频繁插入删除、不用随机访问 → 用 list
总结
list是双向链表,插入删除超快,不支持随机访问- 必须用
#include <list> - 常用操作:
push_back、push_front、pop、insert、erase、remove - 遍历只能用迭代器或范围for
- 高级功能:
sort()、unique()、reverse()、splice()
你现在已经完全掌握 C++ list 了!需要我给你出几道练习题巩固吗?
0 条评论
目前还没有评论...