std::list是双向链表,插入删除O(1),不支持随机访问,迭代器稳定,适用于频繁中间修改场景。

在C++ STL中,std::list 是一个双向链表容器,支持高效地在任意位置插入和删除元素。与 vector 不同,list 不提供随机访问,但它的插入和删除操作不会导致其他元素的内存移动,因此在频繁修改数据结构时表现更优。
std::list 的主要特性
std::list 具有以下关键特点:
- 底层为双向链表,每个节点包含前驱和后继指针
- 不支持通过下标随机访问(不能用 []),必须使用迭代器遍历
- 插入和删除元素的时间复杂度为 O(1),只要已知位置
- 迭代器在插入/删除操作后依然有效(被删元素的迭代器除外)
- 内存开销较大,每个节点额外存储两个指针
常用操作与示例代码
以下是 list 常见操作的使用方式:
// 包含头文件
#include
#include iostream>
int main() {
std::list
// 在末尾添加元素
lst.push_back(4);
// 在开头添加元素
lst.push_front(0);
// 插入到指定位置(例如在值为3的元素前插入99)
auto it = std::find(lst.begin(), lst.end(), 3);
if (it != lst.end()) {
lst.insert(it, 99);
}
// 删除特定值(所有等于99的元素)
lst.remove(99);
// 删除某个位置的元素
it = std::find(lst.begin(), lst.end(), 2);
if (it != lst.end()) {
lst.erase(it);
}
// 遍历输出
for (const auto& val : lst) {
std::cout }
std::cout
return 0;
}
立即学习“C++免费学习笔记(深入)”;
迭代器与遍历方式
由于 list 不支持随机访问,必须使用双向迭代器进行遍历:
- begin()/end():正向遍历
- rbegin()/rend():反向遍历
- 迭代器只支持 ++ 和 -- 操作,不支持 +n 或 -n 跳跃
// 反向遍历示例
for (auto rit = lst.rbegin(); rit != lst.rend(); ++rit) {
std::cout }
适用场景与性能对比
list 最适合需要频繁在中间插入或删除元素的场景。比如实现待办事项列表、文本编辑器中的行管理等。
- 若需频繁随机访问,选 vector
- 若需频繁首尾增删,vector 或 deque 更合适
- 若需中间频繁修改且不常访问具体位置,list 更优
基本上就这些。std::list 提供了灵活的动态结构,理解其底层机制有助于合理选择容器类型。不复杂但容易忽略的是迭代器稳定性这一点,在实际编程中非常有用。










