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。
- 先用
std::strlen(p)获取长度,再构造区间:std::reverse(p, p + len) - 确保
p指向可写内存;指向字面量(如"hello")会触发未定义行为 - 如果不确定是否以
\0结尾,必须传入明确长度,不能依赖strlen
性能与兼容性:std::reverse 在所有标准库中行为一致
无论 libstdc++、libc++ 还是 MSVC STL,std::reverse 都是就地、稳定、无异常抛出(除非元素交换抛异常,而 char 交换不会)。
有人试图用 std::string 的 assign + rbegin/rend 构造新串来“反转”,这会分配新内存、拷贝全部字符,时间和空间开销都更大,纯属画蛇添足。
- 原地翻转永远优于构造新串,除非你需要保留原字符串
-
std::reverse对std::vector、std::array同样适用,接口一致 - 在 C++20 中,仍推荐用
std::reverse,没有更优替代
真正容易被忽略的是:反转操作本身很快,但如果你在循环里反复对同一字符串做 reserve() 或拼接后再反转,瓶颈往往不在 std::reverse,而在前面的内存管理上。
# go
# c++
# 标准库
# String
# Array
# strlen
# const
# 字符串
# char
# 循环
# 风格字符串
# 指针
# 接口
# Length
# len
# 对象
# 算法
# 的是
# 迭代
# 第一个
# 转到
# 最简单
# 则会
# 都是
# 直接调用
# 画蛇添足
# 你在
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel怎么实现模型属性转换Casting_Laravel自动将JSON字段转为数组【技巧】
高端智能建站公司优选:品牌定制与SEO优化一站式服务
Laravel Facade的原理是什么_深入理解Laravel门面及其工作机制
javascript中的数组方法有哪些_如何利用数组方法简化数据处理
Win11搜索不到蓝牙耳机怎么办 Win11蓝牙驱动更新修复【详解】
JS实现鼠标移上去显示图片或微信二维码
无锡营销型网站制作公司,无锡网选车牌流程?
弹幕视频网站制作教程下载,弹幕视频网站是什么意思?
如何使用 Go 正则表达式精准提取括号内首个纯字母标识符(忽略数字与嵌套)
微信小程序 五星评分(包括半颗星评分)实例代码
PHP正则匹配日期和时间(时间戳转换)的实例代码
BootStrap整体框架之基础布局组件
Laravel如何实现事件和监听器?(Event & Listener实战)
手机网站制作与建设方案,手机网站如何建设?
文字头像制作网站推荐软件,醒图能自动配文字吗?
长沙企业网站制作哪家好,长沙水业集团官方网站?
移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?
深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?
百度浏览器网页无法复制文字怎么办 百度浏览器复制修复
如何快速搭建个人网站并优化SEO?
IOS倒计时设置UIButton标题title的抖动问题
网站建设保证美观性,需要考虑的几点问题!
Python自动化办公教程_ExcelWordPDF批量处理案例
香港服务器网站卡顿?如何解决网络延迟与负载问题?
mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?
Python文本处理实践_日志清洗解析【指导】
php后缀怎么变mp4格式错误_修改扩展名提示格式不对怎么办【技巧】
佐糖AI抠图怎样调整抠图精度_佐糖AI精度调整与放大细化操作【攻略】
如何用PHP快速搭建CMS系统?
Laravel路由Route怎么设置_Laravel基础路由定义与参数传递规则【详解】
laravel怎么为应用开启和关闭维护模式_laravel应用维护模式开启与关闭方法
详解Nginx + Tomcat 反向代理 负载均衡 集群 部署指南
网站制作大概多少钱一个,做一个平台网站大概多少钱?
湖南网站制作公司,湖南上善若水科技有限公司做什么的?
什么是JavaScript解构赋值_解构赋值有哪些实用技巧
韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南
如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?
Android自定义listview布局实现上拉加载下拉刷新功能
今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】
微信公众帐号开发教程之图文消息全攻略
Laravel如何与Vue.js集成_Laravel + Vue前后端分离项目搭建指南
Laravel Blade模板引擎语法_Laravel Blade布局继承用法
Laravel如何实现RSS订阅源功能_Laravel动态生成网站XML格式订阅内容【教程】
如何快速建站并高效导出源代码?
手机怎么制作网站教程步骤,手机怎么做自己的网页链接?
如何在IIS服务器上快速部署高效网站?
Windows家庭版如何开启组策略(gpedit.msc)?(安装方法)
Laravel事件和监听器如何实现_Laravel Events & Listeners解耦应用的实战教程
Laravel模型关联查询教程_Laravel Eloquent一对多关联写法
Laravel如何处理表单验证?(Requests代码示例)

