📜 list 容器详解¶
📌 概述¶
list
是 C++ STL 中的序列式容器,底层采用的是 双向链表 结构,因此在插入、删除操作方面非常高效,尤其是在 任意位置频繁插入或删除元素 的场景下表现优异。不同于 vector
的连续内存结构,list
的元素不连续,访问元素效率较低。
🛠 基本用法¶
#include <list>
using namespace std;
list<int> l; // 创建一个空的 list 容器
📖 常用函数及操作¶
函数名 | 功能描述 | 使用示例 | 注意事项 |
---|---|---|---|
push_back(x) |
在尾部插入元素 | l.push_back(1); |
时间复杂度 O(1) |
push_front(x) |
在头部插入元素 | l.push_front(2); |
时间复杂度 O(1) |
pop_back() |
删除尾部元素 | l.pop_back(); |
list 不能为空 |
pop_front() |
删除头部元素 | l.pop_front(); |
list 不能为空 |
insert(pos, x) |
在指定位置插入元素 | l.insert(it, 5); |
传入的是迭代器位置 |
erase(pos) |
删除指定位置的元素 | l.erase(it); |
迭代器失效要谨慎 |
clear() |
清空容器 | l.clear(); |
|
empty() |
判断是否为空 | l.empty(); |
为空返回 true |
size() |
获取元素个数 | l.size(); |
|
front() |
访问第一个元素 | l.front(); |
不可为空 |
back() |
访问最后一个元素 | l.back(); |
不可为空 |
begin() |
获取指向第一个元素的迭代器 | auto it = l.begin(); |
|
end() |
获取指向末尾后一个位置的迭代器 | auto it = l.end(); |
|
sort() |
排序 | l.sort(); |
只能用成员函数排序 |
reverse() |
反转 list | l.reverse(); |
|
unique() |
去重(仅相邻重复元素) | l.unique(); |
需先 sort() |
📌 示例代码¶
#include <iostream>
#include <list>
using namespace std;
int main() {
list<int> l;
l.push_back(1); // 尾部插入
l.push_front(2); // 头部插入
l.push_back(3);
for (auto x : l) cout << x << " "; // 输出 2 1 3
cout << endl;
auto it = l.begin();
advance(it, 1); // 移动迭代器到第二个位置
l.insert(it, 10); // 插入到第二个位置前
for (auto x : l) cout << x << " "; // 输出 2 10 1 3
cout << endl;
l.pop_front();
l.pop_back();
for (auto x : l) cout << x << " "; // 输出 10 1
cout << endl;
l.sort(); // 排序
l.reverse(); // 反转
for (auto x : l) cout << x << " "; // 输出 10 1
cout << endl;
return 0;
}
⚠️ 注意事项¶
list
不支持随机访问,不能使用[]
访问元素。- 所有插入/删除操作时间复杂度为 O(1),而遍历是 O(n)。
- 与
vector
相比,它更适合频繁的插入和删除操作。 - 排序时只能使用
list
自带的sort()
,不能用std::sort()
。
💡 应用场景¶
- 📥 实现 LRU 缓存淘汰策略(双向链表 + 哈希表)
- 🔄 循环链表模拟
- 📚 频繁插入与删除的场景(如编辑器、链表模拟)
- 📍 用于滑动窗口问题(与 deque 结合)
✅ 总结¶
🌟 list
是一个非常适合处理链式数据结构的 STL 容器。掌握它的用法能够让你在一些特定题型中事半功倍!记得多练习,多用迭代器,写出又快又优雅的代码吧!🎯