0

0

C++怎么反转容器 C++中std::reverse操作【入门】

尼克

尼克

发布时间:2026-03-12 19:09:13

|

425人浏览过

|

来源于php中文网

原创

std::reverse不能直接反转map/set,因其仅接受随机访问迭代器,而map/set使用双向迭代器,编译报错;可用vector等容器替代,或用rbegin()/rend()反向遍历。

c++怎么反转容器 c++中std::reverse操作【入门】

std::reverse 为什么不能直接反转 map/set?

因为 std::reverse 只接受随机访问迭代器(RandomAccessIterator),而 std::mapstd::set 的迭代器是双向的(BidirectionalIterator),传进去编译直接报错:error: no matching function for call to 'reverse'

常见误操作是把 map.begin()map.end()std::reverse 里塞,结果连第一行都过不了。

  • 能用 std::reverse 的:std::vectorstd::dequestd::array、原生数组
  • 不能用的:std::liststd::mapstd::setstd::unordered_map
  • 替代方案不是“换函数”,而是“换容器”——比如把 map 的键值对拷进 vector 再反转

std::reverse 修改的是原容器,不是副本

它就地翻转,没有返回值(void),所有改动直接反映在原对象上。这点和 Python 的 reversed()list[::-1] 完全不同,后者生成新序列。

典型踩坑场景:想“试试看反转效果”却忘了备份,调试完发现数据已经乱了。

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

  • 安全做法:反转前用 auto backup = vec; 拷贝一份(对小容器开销可忽略)
  • 如果只想要反向遍历,别反转,直接用 rbegin()/rend() —— 更快且不改原数据
  • std::reverse(vec.begin(), vec.end()) 中两个迭代器必须来自同一容器,跨容器混用会触发未定义行为

反转字符串时,std::string 是特例但要注意编码

std::string 底层是 std::vector<char>,所以 std::reverse(str.begin(), str.end()) 能跑通,但只按字节翻转。

Bolt.new
Bolt.new

Bolt.new是一个免费的AI全栈开发工具

下载

遇到 UTF-8 字符串(比如含中文、emoji)就会出问题:一个汉字占 3 字节,翻转后字节序错乱,变成非法 UTF-8,打印出来是乱码或程序崩溃。

  • 纯 ASCII 文本(英文、数字、基础符号)可以放心用 std::reverse
  • 要支持 Unicode,得先用 ICU、utf8cpp 等库把字符串拆成 code point 再反转,不能碰原始字节
  • 命令行参数或文件读入的字符串,务必先确认编码,别默认它是“安全的”

性能敏感场景下,别为反转多一次遍历

std::reverse 时间复杂度是 O(n),内部就是首尾交换,常数很小。但它强制执行一次完整遍历,如果后续只是读取反向内容,这次遍历纯属浪费。

尤其在循环里反复反转又恢复,或者容器很大(百万级元素),CPU 缓存友好性也会下降。

  • 高频反向访问:优先用 for (auto it = c.rbegin(); it != c.rend(); ++it)
  • 需要反转结果参与后续算法(比如和另一个反转后的容器比对):再考虑真正调用 std::reverse
  • 容器本身支持反向迭代器(所有标准容器都支持),就别动原数据 —— 这是最轻量、最不易出错的选择

真正需要反转的时刻其实不多,多数时候你以为要反转,其实只要换个方向看就行。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1030

2023.08.02

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

492

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

382

2023.10.25

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

760

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

221

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1567

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

649

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

1228

2024.03.22

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

76

2026.03.11

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 11.2万人学习

C 教程
C 教程

共75课时 | 5.4万人学习

C++教程
C++教程

共115课时 | 21.6万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号