用for循环手动交换字符最直接,只需遍历字符串前半部分,通过左右下标交换实现反转;关键点是只遍历到i < s.length()/2,避免重复交换。

用 for 循环手动交换字符最直接
不需要额外库,靠下标遍历一半长度就能完成反转。关键点是只遍历到 i ,否则会翻回去。
常见错误是循环条件写成 i ,结果前后半段反复交换,最终字符串看起来没变。
- 对
std::string操作时,用s[i]和s[s.length() - 1 - i]交换 - 注意
length()返回size_t(无符号),除法结果自动向下取整,安全 - 如果字符串为空或只有一个字符,循环不执行,天然兼容
std::string s = "hello";
for (size_t i = 0; i < s.length() / 2; ++i) {
std::swap(s[i], s[s.length() - 1 - i]);
}
// s 变成 "olleh"
std::reverse 是标准且安全的选择
它本质也是双指针交换,但封装好、可读性强、支持任意迭代器范围,比手写更少出错。
容易被忽略的是:它修改原字符串,不返回新副本。如果需要保留原串,得先拷贝。
立即学习“C++免费学习笔记(深入)”;
- 头文件必须包含
<algorithm> - 参数是迭代器范围:
std::reverse(s.begin(), s.end()) - 对 C 风格字符串(
char*)不适用,需转成std::string或用std::reverse配合数组指针
#include <algorithm> std::string s = "world"; std::reverse(s.begin(), s.end()); // 直接修改 s
用 while 双指针避免整数溢出风险
当字符串极长(接近 SIZE_MAX),s.length() - 1 - i 可能因无符号回绕出错——虽然现实中极少,但在嵌入式或安全敏感场景值得提防。
双指针法用两个变量分别从首尾向中间收敛,完全避开减法运算,逻辑也更清晰。
- 初始化
left = 0,right = s.length() - 1 - 循环条件是
left ,每次交换后 <code>++left、--right - 注意
right是有符号类型(如int)更稳妥,或确保s.length() > 0再赋值
std::string s = "test";
int left = 0;
int right = static_cast<int>(s.length()) - 1;
while (left < right) {
std::swap(s[left++], s[right--]);
}
别在循环里调用 length() 多次
虽然 std::string::length() 是 O(1),但编译器不一定每次都优化掉重复调用。更严重的是语义干扰:如果循环体里意外修改了字符串,length() 结果可能变化,导致越界或提前退出。
尤其在调试或后续扩展逻辑时,这种隐式依赖容易埋雷。
- 把长度存进局部变量,比如
const size_t n = s.length(); - 所有基于长度的计算(如
n/2、n-1-i)都用这个变量 - 即使当前逻辑简单,这一步也建议养成习惯
实际写的时候,优先用 std::reverse;非要手写就选 for 或 while 双指针,但记得缓存长度、检查边界类型。最麻烦的不是写法,而是混用有符号/无符号和忽略空串边界。


















