遍历 std::list 必须用迭代器或范围 for 循环,因其不支持下标访问和随机访问;手动迭代需用 != 判断 end(),删除元素要用 erase() 返回的新迭代器;性能上遍历慢但增删快,应根据实际需求选择容器。

用迭代器遍历 std::list 是最安全的方式
直接用下标访问 std::list 会编译失败,因为它是双向链表,不支持随机访问。必须用迭代器——这是设计使然,不是语法限制。
-
std::list的operator[]根本不存在,写lst[0]会报错no operator [] matches these operands - 推荐用范围
for循环(C++11 起),底层自动调用begin()和end() - 若需修改元素,用
auto&;只读则用const auto&或auto
std::list<int> lst = {1, 2, 3};
for (const auto& x : lst) {
std::cout << x << " "; // 输出:1 2 3
}
手动控制迭代器时注意 end() 是“末尾之后”的位置
std::list::end() 返回的不是最后一个元素的迭代器,而是指向逻辑结尾的哨兵位置。循环中用 != 判断,不能用 <= 或 ==(除非确定非空且已校验)。
- 错误写法:
for (auto it = lst.begin(); it <= lst.end(); ++it)——std::list迭代器不支持<= - 正确写法:
for (auto it = lst.begin(); it != lst.end(); ++it) - 遍历时删元素必须用
erase()返回的新迭代器,否则it失效
std::list 遍历性能差但插入/删除快,别误当 std::vector 用
每次移动迭代器都要跳指针,std::list 的遍历是 O(n) 时间但常数很大;而 std::vector 是连续内存,CPU 缓存友好。
- 如果代码里反复遍历、很少插入删除,大概率该换
std::vector或std::deque -
std::list::size()在 C++11 前是 O(n),虽然后续标准要求 O(1),但某些老库或自定义分配器可能仍慢 - 用
std::list::front()/std::list::back()取首尾是 O(1),但取中间第 k 个元素一定是 O(k)
用 std::for_each 或算法时,确保传入的是有效区间
std::for_each、std::find 等算法依赖迭代器区间 [first, last),和手写循环一样,last 必须是 end() 或合法的“一过性”位置。
立即学习“C++免费学习笔记(深入)”;
- 传
lst.begin()和lst.end()没问题;传lst.begin()和lst.begin() + 3会编译失败(std::list迭代器不支持+) - 想截取前 N 个?得用
std::next(lst.begin(), N),但要先检查N <= lst.size() - lambda 捕获
&修改外部变量没问题,但别在 lambda 里对lst做增删——迭代器可能失效











