目录
1、std::list的基本概念
2、std::list的结构定义(简化)
3、std::list的核心特性
4、std::list的常用函数
4.1 构造和赋值
4.2 添加元素
4.3 删除元素
4.4 访问元素
4.5 遍历
4.6 迭代器与移动
4.7 容量相关
4.8 排序/去重/反转
4.9 splice(list 的灵魂)
5、std::list的迭代器
6、什么时候用 std::list?(决策表)
7、std::list的使用
8、总结
非AI生成,觉得有用,就请您帮忙点赞转发收藏吧,您的鼓励是我创作的动力,多谢看官。
由于能力水平有限,文中的错误或不严谨的地方在所难免,还请批评指正。
1、std::list的基本概念
std::list是双向链表(doubly linked list),底层是节点式结构,不是连续内存。
2、std::list的结构定义(简化)
template<typename T>
struct Node {
T value;
Node* prev;
Node* next;
};
3、std::list的核心特性
特性 | 说明 |
|---|---|
底层结构 | 双向链表 |
随机访问 | ❌ 不支持 |
插入删除 | ✅ O(1)(已知位置) |
内存布局 | ❌ 不连续,cache 不友好 |
迭代器稳定性 | ✅ 插入/删除不影响其他迭代器 |
内存开销 | ❌ 每个元素两个指针 |
4、std::list的常用函数
4.1 构造和赋值
std::list<int> l1; // 空
std::list<int> l2 = {1,2,3}; // 初始化列表
std::list<int> l3(10, 42); // 10 个 42
std::list<int> l4(l2); // 拷贝
std::list<int> l5(l2.begin(), l2.end()); // 区间构造
4.2 添加元素
1.头部添加元素
ls.push_front(1); // 头插 O(1)
ls.push_back(2); // 尾插 O(1)ls.emplace_front(1, 2); // 直接在头部构造
ls.emplace_back(3, 4); // 直接在尾部构造emplace_*优于push_*(少一次拷贝/移动)
2.在迭代器位置插入
auto it = ls.begin();
ls.insert(it, 10); // 插入一个
ls.insert(it, 3