std::reverse 是最快最安全的字符串反转方法,时间复杂度 O(n)、无额外内存开销、原地操作;需正确传入双向迭代器范围,如 s.begin() 和 s.end(),不可混用 size() 等非迭代器类型。

用 std::reverse 最快最安全
直接调用 std::reverse 是 C++ 反转字符串的标准做法,底层是双向迭代器交换,时间复杂度 O(n),无额外内存开销。它操作的是原字符串对象,不生成新副本。
常见错误是传入错误的迭代器范围,比如把 str.begin() 和 str.end() 写成 str.begin() 和 str.size() —— 后者根本不是迭代器,编译不过。
-
std::string s = "hello"; std::reverse(s.begin(), s.end());→ 得到"olleh" - 对
std::wstring同样适用,只需保证迭代器类型匹配 - 如果字符串来自
const char*,得先构造std::string,std::reverse不能直接操作 C 风格字符串
手动循环反转要注意边界和索引类型
手写 for 循环看似可控,但容易在索引计算上出错,尤其当字符串长度为 0 或 1 时——边界条件没处理好会越界或不生效。
典型错误是用 int i 当索引,而 s.length() 返回 size_t(无符号),导致 i >= 0 判断失效、循环卡死。
立即学习“C++免费学习笔记(深入)”;
- 正确写法:
for (size_t i = 0; i - 必须用
size_t或decltype(s.length())做索引类型,避免有/无符号混用 - 除法用整数除法没问题,
s.length() / 2对奇数长度自动向下取整,中间字符不动,符合预期
用 std::string 构造函数反转会多一次拷贝
有人用 std::string(s.rbegin(), s.rend()) 创建新字符串,语法简洁,但隐式分配新内存、拷贝全部字符——如果原字符串很大,这会带来可观开销,且原字符串没变。
这不是“反转”,而是“构造一个反转副本”。除非你明确需要不可变副本(比如传给只接受 const std::string& 的接口),否则没必要。
-
std::string reversed(s.rbegin(), s.rend());→reversed是新对象,s不变 - 性能敏感场景(如高频处理长日志行)应避免此写法
- 若后续还要修改原串,再用
std::reverse就白拷贝了一次
Unicode 字符串不能直接按 char 反转
如果字符串含 UTF-8 编码的中文、emoji 等,std::reverse 会按字节翻转,破坏多字节序列,结果变成乱码或非法 UTF-8。
C++ 标准库不内置 Unicode 支持,std::string 本质是字节容器。要真正反转“字符”,得先做 UTF-8 解码,按码点反转,再编码回 UTF-8。
- 没有标准方案,需依赖第三方库(如
utf8cpp或icu) - 简单判断:如果输入可能含非 ASCII 字符,别碰
std::reverse—— 先确认编码和需求边界 - 命令行参数、文件路径等场景通常可假设为 ASCII 或本地编码,此时直接反转安全
实际项目里,90% 的情况用 std::reverse(s.begin(), s.end()) 就够了;剩下那 10%,往往卡在没意识到字符串是 UTF-8。


















