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

C++ —— 正向迭代器与反向迭代器

目录

1. 正向迭代器(Forward Iterator)

1.1 基本概念

1.2 核心特性

1.3 典型使用

1.4 重要特点

2. 反向迭代器(Reverse Iterator)

2.1 基本概念

2.2 核心特性

2.3 典型使用

2.4 重要特点

3. 正反迭代器对比

4. 正反迭代器转换

4.1 base() 方法

4.2 转换示例

5. 迭代器失效问题

5.1 共同规则

5.2 特殊注意事项


1. 正向迭代器(Forward Iterator)

1.1 基本概念

正向迭代器是STL中最基础的迭代器类型,用于从容器的开始到结束顺序遍历元素。所有标准容器(如vectorstringlist等)都至少支持正向迭代器。

1.2 核心特性

  • 遍历方向:从begin()end()(从左到右)

  • 支持的操作

    • *it(解引用)

    • ->(成员访问)

    • ++it / it++(向后移动)

    • == / !=(比较)

  • 类别:属于前向迭代器(Forward Iterator)或更强的迭代器类型

1.3 典型使用

std::vector<int> v = {1, 2, 3, 4};// 使用正向迭代器遍历
for (auto it = v.begin(); it != v.end(); ++it) {std::cout << *it << " "; // 输出: 1 2 3 4
}

1.4 重要特点

  • end()指向的是最后一个元素的下一个位置(尾后迭代器)

  • 区间表示法为左闭右开 [begin, end)

  • 所有标准算法(如std::sortstd::find)都基于这种迭代器设计


2. 反向迭代器(Reverse Iterator)

2.1 基本概念

反向迭代器是正向迭代器的适配器,用于从容器的末尾向开头逆向遍历元素。它是通过封装正向迭代器实现的。

2.2 核心特性

  • 遍历方向:从rbegin()rend()(从右到左)

  • 支持的操作

    • *rit(解引用)

    • ->(成员访问)

    • ++rit / rit++(向前移动)

    • == / !=(比较)

  • 底层实现:基于正向迭代器,但逻辑反转

2.3 典型使用

std::vector<int> v = {1, 2, 3, 4};// 使用反向迭代器遍历
for (auto rit = v.rbegin(); rit != v.rend(); ++rit) {std::cout << *rit << " "; // 输出: 4 3 2 1
}

2.4 重要特点

  • rbegin()指向最后一个元素

  • rend()指向第一个元素的前一个位置

  • 区间表示法仍为左闭右开 [rbegin, rend)

  • ++rit实际上是让内部的正向迭代器--


3. 正反迭代器对比

特性正向迭代器反向迭代器
起始位置begin()(首元素)rbegin()(末元素)
结束位置end()(尾后)rend()(首前)
遍历方向从前向后从后向前
operator++向后移动向前移动
解引用值当前元素当前元素
底层实现直接迭代正向迭代器的适配器
区间表示[begin, end)[rbegin, rend)

4. 正反迭代器转换

4.1 base() 方法

反向迭代器提供了base()方法,可以获取对应的正向迭代器:

std::vector<int> v = {1, 2, 3, 4};
auto rit = v.rbegin(); // 指向4
auto it = rit.base();  // 指向end()(即4的后面)

重要关系

  • ritrit.base()的物理位置相邻

  • *rit == *(rit.base() - 1)

4.2 转换示例

// 在反向迭代器位置插入元素
std::vector<int> v = {1, 2, 3, 4};
auto rit = std::find(v.rbegin(), v.rend(), 2); // 找到2的反向迭代器
v.insert(rit.base(), 99); // 在2后面插入99
// v变为 {1, 2, 99, 3, 4}

5. 迭代器失效问题

5.1 共同规则

  • 插入/删除元素可能导致所有迭代器失效

  • 扩容操作(如vectorpush_back)会使所有迭代器失效

5.2 特殊注意事项

  • 反向迭代器的失效规则与其对应的正向迭代器一致

  • 在修改容器后,必须重新获取迭代器

http://www.xdnf.cn/news/2664.html

相关文章:

  • 5000元可以运行32B大模型的笔记本
  • Shell脚本-嵌套循环应用案例
  • vue mixin混入与hook
  • 如何使用可视化工具分析 JVM 的性能瓶颈?
  • Spring Security授权管理
  • 综合练习一
  • JAVA基础:Collections 工具类实战指南-从排序到线程安全
  • ViTa-Zero:零样本视觉触觉目标 6D 姿态估计
  • Ubuntu深度学习革命:NVIDIA-Docker终极指南与创新实践
  • LLVIP、KAIST、M3FD数据集
  • GD32F407单片机开发入门(十六)单片机IAP(在应用编程)详解及实战源码
  • 消息队列优化指南:处理堆积与保障消息可靠性
  • 喜马拉雅卖身腾讯音乐:在线音频独立时代的终结
  • Molex莫仕连接器:增强高级驾驶辅助系统,打造更安全的汽车
  • codeforces C. The Trail
  • 【Nginx】 使用least_conn负载均衡算法是否能将客户端的长连接分散到不同的服务器上demo
  • 【AI生产力工具】Windsurf,一款AI编程工具
  • 华纳云:centos如何实现JSP页面的动态加载
  • 模板方法模式(Template Method Pattern)
  • 数据库对象概述
  • Java项目与技术栈场景题深度解析
  • C语言(5)—操作符详解
  • leetcode 143. 重排链表
  • js day8
  • Java学习手册: IoC 容器与依赖注入
  • leetcode刷题日记——两数相加
  • 【Redis】基础4:作为分布式锁
  • 搭建speak yarn集群:从零开始的详细指南
  • 关于健身房管理系统前后端软件开发主要功能需求分析
  • 深入理解网络原理:TCP协议详解