用for循环手动交换字符最直接,只需遍历字符串前半部分,通过左右下标交换实现反转;关键点是只遍历到i
用
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 <h3> <code>std::reverse</code> 是标准且安全的选择</h3><p>它本质也是双指针交换,但封装好、可读性强、支持任意迭代器范围,比手写更少出错。</p><p>容易被忽略的是:它修改原字符串,不返回新副本。如果需要保留原串,得先拷贝。</p>
- 头文件必须包含
<algorithm></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 </algorithm>用
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 <h3>别在循环里调用 <code>length()</code> 多次</h3> <p>虽然 <code>std::string::length()</code> 是 O(1),但编译器不一定每次都优化掉重复调用。更严重的是语义干扰:如果循环体里意外修改了字符串,<code>length()</code> 结果可能变化,导致越界或提前退出。</p> <p>尤其在调试或后续扩展逻辑时,这种隐式依赖容易埋雷。</p> <ul> <li>把长度存进局部变量,比如 <code>const size_t n = s.length();</code> </li> <li>所有基于长度的计算(如 <code>n/2</code>、<code>n-1-i</code>)都用这个变量</li> <li>即使当前逻辑简单,这一步也建议养成习惯</li> </ul> <p>实际写的时候,优先用 <code>std::reverse</code>;非要手写就选 <code>for</code> 或 <code>while</code> 双指针,但记得缓存长度、检查边界类型。最麻烦的不是写法,而是混用有符号/无符号和忽略空串边界。</p></int>
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!












