C++中的迭代器(iterator)怎么用?C++遍历STL容器的方法【教程】

迭代器是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种推荐方式)

根据需求选择合适风格,兼顾可读性与安全性:

  • 传统 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 += 3it[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、解引用、移动和失效规则,就能稳妥用好迭代器。不复杂但容易忽略细节,多写几遍就成直觉了。