迭代器是C++中访问STL容器元素的核心工具,本质为泛化的指针,支持统一遍历、插入和删除操作;每个容器提供begin()和end()函数,其中end()指向末元素后位置,不可解引用。

迭代器是C++中访问STL容器元素的核心工具,本质是泛化的指针,能统一操作不同容器(如vector、list、map)的遍历、插入和删除。
基础用法:声明、解引用与移动
每个STL容器都提供 begin() 和 end() 成员函数,返回对应类型的迭代器。注意:end() 指向最后一个元素之后的位置,不是有效元素,遍历时不能解引用。
常见操作示例:
- vector
v = {10, 20, 30}; - auto it = v.begin(); // 推荐用 auto 简化类型书写
- cout
- ++it; // 移动到下一个位置(前缀++更高效)
- it != v.end() // 循环条件:只要没到末尾就继续
常用遍历写法(3种推荐方式)
根据需求选择合适风格,兼顾可读性与安全性:
立即学习“C++免费学习笔记(深入)”;
-
传统 for + 迭代器:适合需要索引或中途修改容器时
for (auto it = c.begin(); it != c.end(); ++it) { cout -
基于范围的 for 循环(C++11起):最简洁,自动处理迭代器,推荐日常使用
for (const auto& x : c) { cout // const auto& 避免拷贝 -
std::for_each + lambda(算法头文件):函数式风格,适合逻辑稍复杂时
for_each(c.begin(), c.end(), [](int x) { cout
不同容器的迭代器类型要注意
不是所有迭代器都支持相同操作。比如:
- vector / deque / array:支持随机访问(it += 3、it[2]),可用 随机访问迭代器
- list / forward_list:只支持前后移动(++it、--it),属于 双向/单向迭代器,不支持 + 5 或下标
- unordered_map / set:迭代器遍历顺序不确定(哈希表无序),但仍是有效的双向迭代器
安全提醒:避免野迭代器
容器被修改(如 erase、clear、resize、push_back 引发扩容)后,原有迭代器可能失效:
-
vector:插入/删除中间元素会使后续迭代器失效;erase 返回下一个有效迭代器,应这样写:
it = c.erase(it); // 删除当前并指向下一位置 - list:只有被删节点的迭代器失效,其他仍有效
- 循环中删除元素时,别盲目 ++it,优先用 erase 的返回值更新
基本上就这些。掌握 begin/end、解引用、移动和失效规则,就能稳妥用好迭代器。不复杂但容易忽略细节,多写几遍就成直觉了。










