讲师中心 微信公众号
AI工具推荐 视频效率加速

C++怎么实现反向迭代器_C++从后往前遍历容器【笔记】

陌墨姑娘_1472

陌墨姑娘_1472

发布时间:2026-03-17 16:59:01

|

612人浏览过

|

来源于php中文网

原创

反向迭代器应使用容器的rbegin()和rend(),它们返回reverse_iterator类型;rbegin()指向末元素,rend()指向首元素前位置,不可解引用;base()返回对应正向迭代器但偏移一位。

c++怎么实现反向迭代器_c++从后往前遍历容器【笔记】

反向迭代器怎么写,rbegin() 和 rend() 是啥

直接用容器自带的 rbegin() 和 rend() 就行,它们返回的是 reverse_iterator 类型,不是普通指针或 iterator。别试图用 --it 从 end() 开始倒着走——那不是标准做法,容易越界且语义不清。

常见错误现象:for (auto it = vec.end(); it != vec.begin(); --it) 看似能跑,但 it-- 在 vec.end() 上解引用是未定义行为;而且 it != vec.begin() 会漏掉第一个元素(因为停在 begin() 而不进去)。

  • rbegin() 指向最后一个元素,rend() 指向“第一个元素前的位置”,和正向的 begin()/end() 对称
  • 所有标准序列容器(vector、deque、list)都支持,array 也支持;但 forward_list 不支持反向迭代(没 rbegin())
  • 反向迭代器解引用后得到的值,和对应正向位置的值完全一致,只是遍历方向相反

reverse_iterator 的 base() 干嘛用的

它用来拿到底层对应的正向迭代器。注意:不是简单映射,rit.base() 返回的迭代器比 rit 当前指向位置「往前一位」。比如 rit == c.rbegin() 时,rit.base() == c.end();rit == c.rend() 时,rit.base() == c.begin()。

这坑很多人踩:想把反向迭代器转成正向位置做下标计算,直接写 rit.base() - c.begin() 会多算 1。正确方式是 (rit.base() - c.begin()) - 1,或者更安全地用 std::distance(c.begin(), rit.base()) - 1。

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

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载
  • 只在需要混合正向/反向逻辑时才调 base(),比如在反向遍历中调用一个只接受正向迭代器的算法
  • base() 返回的是 const 或非 const 版本,取决于反向迭代器类型,不能跨 const 性质赋值
  • 对 rend() 调 base() 是合法的,结果是 begin();但对 rend() 解引用是未定义行为

自定义容器怎么加反向迭代器支持

核心是提供 rbegin() 和 rend() 成员函数,返回你封装的 reverse_iterator<T> 类型。标准库的 std::reverse_iterator 可以复用,只要你的正向迭代器满足 LegacyIterator 要求(有 operator++、operator*、operator!= 等)。

常见错误现象:自己手写 reverse_iterator 类,但 operator* 返回了临时对象的引用,导致悬垂引用;或者 operator++ 实现成向前走,实际该向后走(反向迭代器的 ++ 应该让底层正向迭代器 --)。

  • 推荐用 std::reverse_iterator<your_iterator> 包装,而不是重造轮子
  • rbegin() 应返回 reverse_iterator(end()),rend() 返回 reverse_iterator(begin())
  • 如果容器支持 const 迭代,必须同时提供 crbegin()/crend(),否则在 const 容器上调用 rbegin() 会编译失败

反向遍历性能有影响吗

对 vector 和 deque,没有额外开销:反向迭代器本质就是对正向迭代器的封装,++ 编译后等价于 --,* 直接取址。但对 list,虽然单次操作仍是 O(1),但 CPU 缓存局部性变差——正向遍历时节点大概率在内存中连续分布,反向则跳来跳去。

真正要注意的是:别在循环里反复调 container.rbegin()。有些同学写 for (auto it = c.rbegin(); it != c.rend(); ++it) 是 OK 的,但若写成 for (auto it = c.rbegin(); it != c.rend(); ++it, c.rbegin())(误加),每次都在重建迭代器,可能触发冗余计算(尤其自定义容器没内联时)。

  • vector::rbegin() 是 O(1) 且通常被内联,放心用
  • 避免在反向循环体里修改容器大小(如 push_back() 或 erase()),这会让 rend() 失效,引发未定义行为
  • 如果只是要倒序访问索引,for (size_t i = v.size(); i-- > 0; ) 比反向迭代器更快(无迭代器对象构造/析构),但可读性差,且不通用

事情说清了就结束。最常被忽略的是 rend() 的语义——它不是指向第一个元素,而是“第一个元素之前”,所以不能解引用;还有就是 base() 的偏移关系,一不留神就差 1。

热门AI工具

更多
Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

相关专题

更多
c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

2098

2023.09.20

C++ 智能指针与现代内存管理
C++ 智能指针与现代内存管理

深入讲解 C++ 现代内存管理的核心工具——智能指针,涵盖 unique_ptr 独占所有权语义、shared_ptr 引用计数机制与循环引用问题、weak_ptr 弱引用的应用场景、make_unique/make_shared 工厂函数的性能优势、自定义删除器的编写、RAII 资源管理思想的实践,以及从裸指针迁移到智能指针的重构策略,帮助开发者编写安全无泄漏的现代 C++ 代码。

339

2026.04.23

页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

5516

2023.08.14

PixTV官网入口地址合集
PixTV官网入口地址合集

本专题汇总了 PixTV AI 一站式视频创作平台的官方入口与使用教程。无需下载软件,浏览器直接访问即可使用。平台将剧本、图像、视频、声音与剪辑整合在“无限画布”中,接入 GPT Image 2.5、Seedance 2.5 等头部模型。本专题整理了从新建画布、角色锚定、分镜拆分到视频生成与导出的完整操作指南,助你快速上手 AI 短剧与漫剧创作。

20

2026.10.10

Kratos框架HTTP与gRPC服务开发教程
Kratos框架HTTP与gRPC服务开发教程

本专题围绕Kratos框架双协议服务开发,涵盖HTTP路由与处理器编写、参数获取、gRPC服务实现与客户端调用、metadata上下文传递、encoding编解码注册、统一响应封装、超时控制与流式响应实现方法。

20

2026.10.10

Kratos框架Protobuf接口定义与代码生成合集
Kratos框架Protobuf接口定义与代码生成合集

本专题讲解Kratos框架接口定义体系,涵盖proto编写规范、proto add/client/server生成命令、http注解路由、validate校验、OpenAPI文档生成、跨服务proto复用与兼容性设计。

0

2026.10.10

C++虚函数怎么定义和调用
C++虚函数怎么定义和调用

C++虚函数是实现运行时多态的重要机制。本专题从virtual关键字的基本用法入手,介绍基类与派生类之间的函数重写、基类指针调用派生类方法,以及动态绑定的执行过程,帮助初学者掌握虚函数的核心语法。

20

2026.10.10

C++类与对象的封装方法教程
C++类与对象的封装方法教程

C++封装是面向对象编程的核心特性之一,通过类将数据与操作数据的函数组织在一起,并利用访问权限控制外部访问。本专题介绍类的定义、成员变量、成员函数以及public、private和protected的使用方法,帮助初学者掌握封装的基本原理。

0

2026.10.10

C++构造函数定义与调用方法
C++构造函数定义与调用方法

C++构造函数用于初始化类对象,是面向对象编程的重要基础。本专题从构造函数的定义、声明和调用入手,介绍默认构造函数、带参数构造函数、拷贝构造函数及成员初始化列表,帮助初学者掌握对象创建与初始化的基本方法。

20

2026.10.10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn