c++怎么实现字符串的左右翻转_c++ reverse函数用法【干货】

1次阅读

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

c++怎么实现字符串的左右翻转_c++ reverse函数用法【干货】

直接说结论: C++ 中翻转字符串最常用、最安全的方式是用 std::reverse,但它操作的是迭代器范围,不是字符串本身;别误以为 std::reverse 是“字符串专属函数”——它其实是通用算法,对 std::Stringstd::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 referencenot 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) —— 会把结尾 '' 也翻进去,导致字符串损坏
  • 如果数组长度固定(如 char buf[100]),且你只想翻前 n 个有效字符,就用 std::reverse(buf, buf + n)

reverse 和手写循环比,性能差吗?

几乎没差别。标准库 std::reverse 内部就是双指针交换,和你手写 for (int i=0, j=len-1; i<j swap> 生成的汇编基本一致。</j>

  • 优势在于语义清晰、不易出错(比如边界条件、 处理)
  • 劣势是初学者容易忽略头文件或迭代器参数,卡在编译阶段
  • std::string_view 同样适用(C++17 起),但注意它不拥有数据,翻转只是逻辑视图——真要改内容还得作用于底层字符串

最容易被忽略的一点:如果你翻转的是 std::string 的子串(比如用 s.substr() 得到临时对象),再对它调用 reverse,实际翻转的是副本,原字符串不变——得用 std::string::erase+insert 或下标操作才能局部翻转。

text=ZqhQzanResources