c++中翻转字符串最常用、最安全的方式是std::reverse(s.begin(), s.end()),它接受迭代器范围而非字符串对象,需包含头文件,原地修改无额外分配。

直接说结论: C++ 中翻转字符串最常用、最安全的方式是用 std::reverse,但它操作的是迭代器范围,不是字符串本身;别误以为 std::reverse 是“字符串专属函数”——它其实是通用算法,对 std::string、std::vector 甚至原生数组都有效。
为什么不能直接 reverse(str)?
std::reverse 不接受容器对象,只接受两个迭代器(begin 和 end)作为参数。写成 reverse(s) 会编译失败,报错类似:no matching function for call to 'reverse'。
常见错误写法:
std::string s = "hello"; std::reverse(s); // ❌ 编译错误
正确写法必须显式传入迭代器:
立即学习“C++免费学习笔记(深入)”;
std::string s = "hello"; std::reverse(s.begin(), s.end()); // ✅
-
s.begin()指向首字符,s.end()指向末尾后一位,这是标准容器的约定 - 翻转后
s变为"olleh",原地修改,无额外内存分配 - 注意:
std::reverse在<algorithm></algorithm>头文件里,漏包含会报undefined reference或not declared
char 数组怎么用 reverse?
C 风格字符串(char[])不能直接用 .begin(),得手动算指针边界:
char s[] = "world"; std::reverse(s, s + std::strlen(s)); // ✅ 注意不是 s + strlen(s) + 1
-
s是首地址,等价于&s[0];s + len是末字符后一位,和std::string::end()语义一致 - 千万别写
std::reverse(s, s + std::strlen(s) + 1)—— 会把结尾'\0'也翻进去,导致字符串损坏 - 如果数组长度固定(如
char buf[100]),且你只想翻前n个有效字符,就用std::reverse(buf, buf + n)
reverse 和手写循环比,性能差吗?
几乎没差别。标准库 std::reverse 内部就是双指针交换,和你手写 for (int i=0, j=len-1; i<j swap> 生成的汇编基本一致。</j>
- 优势在于语义清晰、不易出错(比如边界条件、
\0处理) - 劣势是初学者容易忽略头文件或迭代器参数,卡在编译阶段
- 对
std::string_view同样适用(C++17 起),但注意它不拥有数据,翻转只是逻辑视图——真要改内容还得作用于底层字符串
最容易被忽略的一点:如果你翻转的是 std::string 的子串(比如用 s.substr() 得到临时对象),再对它调用 reverse,实际翻转的是副本,原字符串不变——得用 std::string::erase+insert 或下标操作才能局部翻转。











