c++的STL迭代器(iterator)是什么 如何遍历容器元素【核心概念】

14次阅读

STL迭代器是访问容器元素的统一接口,本质为重载指针操作符的类对象,解耦算法与容器,使sort、find等算法不依赖具体容器类型;通过begin()/end()获取,end()指向末尾后一位置。

c++的STL迭代器(iterator)是什么 如何遍历容器元素【核心概念】

STL迭代器是访问容器元素的统一接口,本质是一个类对象,行为类似指针——能解引用(*)、自增(++)、比较(==/!=),但屏蔽了底层存储细节。它把“怎么存”和“怎么用”分开,让算法(如sortfind)不依赖具体容器类型。

迭代器的核心作用:解耦算法与容器

不同容器内存布局不同(vector连续,list链式,map红黑树),但只要提供符合要求的迭代器,同一个for_each就能遍历它们。标准库算法只认迭代器操作,不管背后是数组还是节点指针。

  • 迭代器不是原生指针,但重载了指针常用操作符,用法高度相似
  • 每种容器定义自己的迭代器类型(如vector::iterator),通常通过begin()/end()获取
  • end()返回的是“末尾后一位置”的迭代器,不指向有效元素,仅作循环边界

常用遍历方式(以vector为例)

假设vector v = {1, 2, 3};

  • 传统for + 迭代器for (auto it = v.begin(); it != v.end(); ++it) { cout
  • 范围for循环(推荐)for (const auto& x : v) { cout —— 编译器自动用迭代器实现,更简洁安全
  • 算法遍历for_each(v.begin(), v.end(), [](int x) { cout

迭代器类型与有效性注意点

迭代器按功能分五类(输入、输出、前向、双向、随机访问),vector支持随机访问(可it += 2),list只支持双向(只能++/--)。

立即学习C++免费学习笔记(深入)”;

  • 容器修改可能使原有迭代器失效:如vector扩容时所有迭代器失效;erase后被删位置及之后的迭代器失效
  • 避免it = v.erase(it)之外的++it写法,尤其在循环中删除元素时
  • cbegin()/cend()获取const迭代器,确保只读访问

快速判断某容器是否支持某种操作

查文档看其迭代器类别,或用std::is_same_v检测(编译期):

  • std::is_same_v::iterator::iterator_category, std::random_access_iterator_tag> 返回true
  • std::is_same_v::iterator::iterator_category, std::bidirectional_iterator_tag> 返回true

不复杂但容易忽略。

text=ZqhQzanResources