C++ 怎么反转字符串 C++ reverse算法原地翻转代码【算法】

发布时间 - 2026-02-02 00:00:00    点击率:
最简单可靠的方法是直接调用 std::reverse(s.begin(), s.end()),时间复杂度 O(n)、空间复杂度 O(1),需确保传入可修改迭代器且避免误用 c_str() 或 const 字符串。

std::reverse 原地反转字符串最简单可靠

直接调用 std::reverse 是 C++ 中反转 std::string 的标准做法,它在头文件 中定义,时间复杂度 O(n),空间复杂度 O(1),且不产生额外拷贝。

常见错误是传入错误的迭代器范围,比如漏掉 .end() 或误用 .c_str() —— 后者返回只读 C 风格字符串,不能被修改。

  • 必须传入可修改的迭代器:用 s.begin()s.end(),不是 s.c_str()
  • const std::string& 无法原地反转,需先拷贝为非 const 对象
  • 如果字符串含嵌入空字符(\0),std::string 仍能正确处理,和 C 字符串不同
#include 
#include 
std::string s = "hello";
std::reverse(s.begin(), s.end()); // s 变成 "olleh"

手动实现 reverse 时注意边界和指针算术

手写双指针翻转适用于教学、嵌入式环境或需精细控制的场景。关键在于循环条件和交换逻辑是否覆盖全部字符,尤其当长度为 0 或 1 时不能越界。

容易踩的坑是把 i 写成 i ,导致中间字符被交换两次(等于没变),或访问 s[j] 越界(当 j 初始值设错)。

  • 起始索引 i = 0,结束索引 j = s.length() - 1(不是 s.size() 以外的值)
  • 循环条件严格用 i ,每次交换后 i++j--
  • std::swap(s[i], s[j]) 比手动临时变量更安全,避免自赋值问题
for (size_t i = 0, j = s.length(); i < --j; ++i) {
    std::swap(s[i], s[j]);
}

反转 C 风格字符串要用 char* 和长度判断

若操作的是 char*(如 char buf[100]new char[n]),不能直接用 std::string 接口。必须自己计算有效长度(遇到第一个

若操作的是 char*(如 char buf[100]new char[n]),不能直接用 std::string 接口。必须自己计算有效长度(遇到第一个 \0 前),否则会翻转到内存垃圾区域。

前),否则会翻转到内存垃圾区域。

典型错误是把 strlen(p) 结果直接当 end 迭代器传给 std::reverse —— 但 std::reverse 需要的是迭代器(指针),不是长度。得用 p

+ len

  • 先用 std::strlen(p) 获取长度,再构造区间:std::reverse(p, p + len)
  • 确保 p 指向可写内存;指向字面量(如 "hello")会触发未定义行为
  • 如果不确定是否以 \0 结尾,必须传入明确长度,不能依赖 strlen

性能与兼容性:std::reverse 在所有标准库中行为一致

无论 libstdc++、libc++ 还是 MSVC STL,std::reverse 都是就地、稳定、无异常抛出(除非元素交换抛异常,而 char 交换不会)。

有人试图用 std::stringassign + rbegin/rend 构造新串来“反转”,这会分配新内存、拷贝全部字符,时间和空间开销都更大,纯属画蛇添足。

  • 原地翻转永远优于构造新串,除非你需要保留原字符串
  • std::reversestd::vectorstd::array 同样适用,接口一致
  • 在 C++20 中,仍推荐用 std::reverse,没有更优替代

真正容易被忽略的是:反转操作本身很快,但如果你在循环里反复对同一字符串做 reserve() 或拼接后再反转,瓶颈往往不在 std::reverse,而在前面的内存管理上。


# go  # c++  # 标准库  # String  # Array  # strlen  # const  # 字符串  # char  # 循环  # 风格字符串  # 指针  # 接口  # Length  # len  # 对象  # 算法  # 的是  # 迭代  # 第一个  # 转到  # 最简单  # 则会  # 都是  # 直接调用  # 画蛇添足  # 你在 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Python并发异常传播_错误处理解析【教程】  网站页面设计需要考虑到这些问题  JavaScript实现Fly Bird小游戏  如何在腾讯云服务器上快速搭建个人网站?  微信小程序 HTTPS报错整理常见问题及解决方案  韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南  详解Nginx + Tomcat 反向代理 如何在高效的在一台服务器部署多个站点  如何有效防御Web建站篡改攻击?  香港服务器建站指南:外贸独立站搭建与跨境电商配置流程  Laravel如何实现文件上传和存储?(本地与S3配置)  高防服务器租用首荐平台,企业级优惠套餐快速部署  用yum安装MySQLdb模块的步骤方法  如何在Windows虚拟主机上快速搭建网站?  Laravel如何使用查询构建器?(Query Builder高级用法)  Python图片处理进阶教程_Pillow滤镜与图像增强  详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)  如何快速配置高效服务器建站软件?  如何快速生成可下载的建站源码工具?  如何在服务器上三步完成建站并提升流量?  手机软键盘弹出时影响布局的解决方法  如何在景安云服务器上绑定域名并配置虚拟主机?  Python自动化办公教程_ExcelWordPDF批量处理案例  Claude怎样写约束型提示词_Claude约束提示词写法【教程】  北京网站制作公司哪家好一点,北京租房网站有哪些?  如何批量查询域名的建站时间记录?  java获取注册ip实例  jquery插件bootstrapValidator表单验证详解  HTML5建模怎么导出为FBX格式_FBX格式兼容性及导出步骤【指南】  公司门户网站制作流程,华为官网怎么做?  HTML 中如何正确使用模板变量为元素的 name 属性赋值  宙斯浏览器视频悬浮窗怎么开启 边看视频边操作其他应用教程  浅谈javascript alert和confirm的美化  1688铺货到淘宝怎么操作 1688一键铺货到自己店铺详细步骤  如何用美橙互联一键搭建多站合一网站?  C++时间戳转换成日期时间的步骤和示例代码  Laravel怎么设置路由分组Prefix_Laravel多级路由嵌套与命名空间隔离【步骤】  Laravel怎么解决跨域问题_Laravel配置CORS跨域访问  Laravel策略(Policy)如何控制权限_Laravel Gates与Policies实现用户授权  Laravel如何连接多个数据库_Laravel多数据库连接配置与切换教程  使用PHP下载CSS文件中的所有图片【几行代码即可实现】  使用Dockerfile构建java web环境  利用JavaScript实现拖拽改变元素大小  香港服务器如何优化才能显著提升网站加载速度?  如何用低价快速搭建高质量网站?  企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?  网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?  装修招标网站设计制作流程,装修招标流程?  Microsoft Edge如何解决网页加载问题 Edge浏览器加载问题修复  Win11怎么开启自动HDR画质_Windows11显示设置HDR选项  Edge浏览器提示“由你的组织管理”怎么解决_去除浏览器托管提示【修复】