C++如何实现反转字符串_C++自带reverse函数使用方法【技巧】

6次阅读

reverse函数定义在中,并非String成员函数;它接收双向迭代器区间[left, right)原地反转元素,需#include ,正确调用为std::reverse(s.begin(), s.end())。

C++如何实现反转字符串_C++自带reverse函数使用方法【技巧】

reverse 函数在 里,不是 string 成员函数

很多人以为 std::string 有自带的 reverse() 成员函数,其实没有。c++ 标准库提供的 reverse 是一个泛型算法,定义在 头文件中,作用于任意支持双向迭代器的容器(包括 std::stringstd::vector 等)。

它不修改容器大小,只交换元素位置,时间复杂度 O(n),原地操作。

  • 必须包含 #include ,否则编译报错:‘reverse’ was not declared in this scope
  • 调用时传入两个迭代器:起始位置和「末尾的下一个位置」,即 begin()end()
  • std::stringend() 指向 NULL 字符之后,reverse 会把它一并翻转 —— 但不影响字符串逻辑长度,因为 size()c_str() 仍以第一个 为准(仅当手动写入 时才需注意)

正确用法:传迭代器,不是传字符串对象

reverse 接收的是迭代器对,不是容器本身。常见错误是写成 reverse(s)s.reverse() —— 都不合法。

正确写法示例:

立即学习C++免费学习笔记(深入)”;

#include  #include  #include  

int main() { std::string s = "hello"; std::reverse(s.begin(), s.end()); // ✅ 正确 std::cout << s << "n"; // 输出 "olleh" }

  • 不能写 std::reverse(s):编译失败,参数类型不匹配
  • 不能写 s.reverse()std::string 没有该成员函数
  • 若用 const std::string,则 begin() 返回 const_iteratorreverse 仍可调用,但无法修改内容 —— 实际会编译失败(因为 reverse 需要可写迭代器)

反转子串:用迭代器偏移控制范围

不需要复制子串再反转,直接用迭代器算出起止位置即可。比如反转从下标 1 开始的 3 个字符:

std::string s = "abcdef"; std::reverse(s.begin() + 1, s.begin() + 1 + 3); // 反转索引 1~3(左闭右开),结果为 "adcbef"
  • 区间是左闭右开:[first, last),所以长度为 last - first
  • 越界行为未定义:确保 first ,否则运行时可能崩溃或静默出错
  • 若想反转后半部分,可用 s.begin() + s.size()/2s.end()

和手写循环比,reverse 有什么实际区别

语义清晰、不易出错、编译器通常能内联优化,性能几乎无差别。但要注意几个隐含细节:

  • 对于空字符串或单字符,reverse(s.begin(), s.end()) 安全且高效,无需额外判断
  • 如果字符串含嵌入式 (如通过 data() 构造或 memcpy 写入),reverse 仍按迭代器范围操作,不会停在第一个 —— 这和 std::string 的逻辑长度无关,但会影响后续 C 风格函数使用
  • 线程环境下,若其他线程同时读写同一 std::stringreverse 不提供同步保障,需自行加锁

真正容易被忽略的是:迭代器有效性依赖于容器未被移动或销毁。如果在 reverse 调用前发生了 s.reserve()s += ... 导致重分配,之前获取的迭代器就失效了 —— 这类 bug 很难复现,但后果严重。

text=ZqhQzanResources