当前位置: 首页 > news >正文

C++ STL | STL迭代器(lterator)

目录

  • 一、什么是迭代器(Iterator)?
  • 二、迭代器的定义与类型别名
  • 三、迭代器的基本操作
    • 主要操作符
  • 四、迭代器的遍历与用法实例
    • 1. 基本遍历(推荐用法)
    • 2. 反向遍历
    • 3. 常量遍历(只读)
    • 4. 范围for循环(C++11)
    • 5. 通过算法(如sort)
  • 五、迭代器的分类及容器支持情况
  • 六、注意事项与易错点
  • 七、综合示例
  • 八、总结
  • 九、参考文献


一、什么是迭代器(Iterator)?

迭代器是C++ STL中用于遍历和操作容器元素的一种对象,本质上类似于“普通指针”,用于“指向”容器的元素。
它屏蔽了容器底层的数据结构差异,为各种容器提供了统一的访问接口。

作用:

  • 遍历容器中的元素
  • 访问、修改容器中的元素
  • 作为STL算法(如sort、find等)的桥梁

二、迭代器的定义与类型别名

每种容器都内置有自己的迭代器类型,通常通过如下方式定义:

std::vector<int>::iterator it;         // 普通迭代器(可读可写)
std::vector<int>::const_iterator cit;  // 常量迭代器(只读)
std::vector<int>::reverse_iterator rit;// 反向迭代器

推荐使用auto自动推导(C++11及以上):

auto it = v.begin();

三、迭代器的基本操作

  • begin(): 指向容器第一个元素
  • end(): 指向容器最后一个元素的下一个位置
  • rbegin(): 反向迭代器,指向最后一个元素
  • rend(): 反向迭代器,指向第一个元素的前一个位置
  • cbegin()/cend(): 常量迭代器

主要操作符

  • *it:解引用,访问元素
  • it++ / ++it:移动到下一个元素
  • it-- / --it:(双向迭代器及以上)移动到上一个元素
  • it1 == it2:判断相等

四、迭代器的遍历与用法实例

1. 基本遍历(推荐用法)

std::vector<int> v = {1, 2, 3, 4};
for (auto it = v.begin(); it != v.end(); ++it) {std::cout << *it << " ";
}

2. 反向遍历

for (auto rit = v.rbegin(); rit != v.rend(); ++rit) {std::cout << *rit << " ";
}

3. 常量遍历(只读)

for (auto it = v.cbegin(); it != v.cend(); ++it) {std::cout << *it << " ";
}

4. 范围for循环(C++11)

for (const auto& x : v) {std::cout << x << " ";
}

5. 通过算法(如sort)

std::sort(v.begin(), v.end());

五、迭代器的分类及容器支持情况

迭代器类型支持操作代表容器
输入迭代器只读,单向++istream_iterator
输出迭代器只写,单向++ostream_iterator
前向迭代器读写,单向++forward_list, unordered_set/map
双向迭代器读写,++/–list, set, map
随机访问迭代器读写,++/–,+n,-n,[]vector, deque, array
连续迭代器(C++17)物理内存连续vector, array

说明:

  • vector、deque支持随机访问(如v[5]),list、set等不支持。
  • unordered_set/map只支持前向迭代器。
  • list/set/map支持双向迭代器,可以++也可以–。

六、注意事项与易错点

  1. 迭代器失效问题

    • vector/deque插入、删除元素时,原有迭代器可能失效(指向无效内存)。
    • list插入不会使其它迭代器失效,删除只影响被删元素的迭代器。
    • set/map插入不会失效,删除只影响被删元素的迭代器。
  2. 不同容器的迭代器不可混用

    • 例如不能用vector的迭代器操作list的元素。
  3. 常量迭代器不能修改元素

    • const_iterator只能读取,不能通过*it修改元素值。
  4. STL算法与迭代器配合

    • 大部分STL算法(如sort、find、reverse)都通过迭代器操作,需传入起止迭代器。

七、综合示例

#include <vector>
#include <iostream>
#include <algorithm>int main() {std::vector<int> v = {3, 1, 4, 2};// 排序std::sort(v.begin(), v.end());// 正向遍历for(auto it = v.begin(); it != v.end(); ++it) {std::cout << *it << " ";}std::cout << std::endl;// 反向遍历for(auto rit = v.rbegin(); rit != v.rend(); ++rit) {std::cout << *rit << " ";}std::cout << std::endl;// 范围forfor(const auto& x : v) {std::cout << x << " ";}std::cout << std::endl;// 查找auto pos = std::find(v.begin(), v.end(), 2);if (pos != v.end()) std::cout << "Found: " << *pos << std::endl;return 0;
}

八、总结

  • 迭代器是贯穿C++ STL的核心工具,屏蔽了底层容器差异,统一了元素遍历方式。
  • 掌握迭代器分类、用法、失效机制,有助于写出健壮、高效、通用的C++代码。
  • 推荐使用auto和范围for提高代码简洁性和可读性。

九、参考文献

  • C++ STL迭代器(iterator)用法详解 - C语言中文网
  • C++ STL迭代器的用法(附带实例) - C语言中文网
  • C++迭代器(STL迭代器)iterator详解 - C语言中文网

http://www.dtcms.com/a/326417.html

相关文章:

  • 阿里千问系列:Qwen3 强化学习新算法GSPO!
  • HTML应用指南:利用GET请求获取全国一加授权零售店位置信息
  • 机器学习逻辑回归实战
  • 【Lua】题目小练10
  • computed使用的方式
  • 【Lua】XLua加载lua文件
  • xlsxio全平台(x86、arm32、arm64 )编译、测试,使用编译脚本10分钟快速编译!
  • redis常见的性能问题
  • 游戏盾是什么?
  • Qwen Code CLI在Windows上的安装与环境配置问题解决
  • 金蝶云星辰:赋能企业数据管理
  • 开发指南130-实体类的主键生成策略
  • 达梦数据库慢SQL日志收集和分析
  • 机器学习 TF-IDF提取关键词,从原理到实践的文本特征提取利器​
  • Java 之抽象类和接口
  • 数据结构-数组扩容
  • 2025苹果CMS泛目录 8月最新可用
  • 软件测评中HTTP 安全头的配置与测试规范
  • 鸿蒙开发中所有自定义装饰器的完整案例解析--涵盖 16 个核心装饰器的详细用法和实战场景
  • QT 高分屏不同缩放比例的自适应处理
  • 数据科学与计算实例应用
  • 借助 ChatGPT 快速实现 TinyMCE 段落间距与行间距调节
  • Ansible 面试题 20250811
  • OpenGL中的EBO:高效渲染的秘密武器(绘制四边形)(Unreal Engine、Unity、Godot原理系列)
  • JavaScript中map和forEach的区别详解
  • 动捕设备是什么?全面解析NOKOV度量动捕设备的原理、类型与应用
  • redis(1)-基本概念
  • ROS2不同版本的区别
  • JVM 运行时全景:从类加载到 GC 的底层原理与调优指南
  • JVM运维