c++反转字符串方法_c++ reverse函数怎么用

16次阅读

std::reverse必须配合迭代器使用,只接受起始和结束迭代器,不接受容器对象本身;正确写法是std::reverse(str.begin(), str.end()),返回void且就地修改。

c++反转字符串方法_c++ reverse函数怎么用

reverse 函数必须配合迭代器使用,不能直接传字符串变量

很多人写 reverse(str) 报错,根本原因是 std::reverse 不接受 std::String 对象本身,只接受一对迭代器(起始和结束位置)。它本质是“反转一段连续内存里的元素”,和容器类型无关。

正确做法是传入 str.begin()str.end()

std::string str = "hello"; std::reverse(str.begin(), str.end()); // ✅ 正确 // str 现在是 "olleh"

常见错误包括:

  • 写成 reverse(str) → 编译失败:no matching function
  • 写成 reverse(str.data(), str.data() + str.Length()) → 虽然能用,但没必要,begin()/end() 更安全、更通用
  • const 字符串调用 → 编译失败:不能修改 const 对象

reverse 是就地反转,不返回新字符串

std::reverse 没有返回值(返回类型是 void),它直接修改原容器。如果需要保留原字符串并得到反转副本,得手动拷贝:

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

std::string original = "world"; std::string reversed = original; // 先拷贝 std::reverse(reversed.begin(), reversed.end()); // 再反转副本

别指望这行代码能工作:std::string s = reverse(s1.begin(), s1.end()); —— 它语法错误,且 reverse 根本不返回任何东西。

如果你习惯函数式风格,可以封装一个辅助函数:

std::string reversed(const std::string& s) {     std::string r = s;     std::reverse(r.begin(), r.end());     return r; }

reverse 支持所有支持随机访问/双向迭代器的容器

不只是 std::stringstd::vectorstd::deque、原生数组(用指针)也都适用:

  • std::vector v = {1,2,3}; std::reverse(v.begin(), v.end());
  • char arr[] = "test"; std::reverse(arr, arr + 4);(注意长度是 4,不是 5,因为不包含末尾
  • std::list 也能用,但性能差(list::reverse() 成员函数更高效)

关键看迭代器类型:只要支持 --it(双向迭代器),就能用 std::reverse。单向迭代器(如 std::forward_list)不行。

手写反转逻辑时要注意边界和 signed/unsigned 混用警告

不用 std::reverse 而用下标循环时,容易在比较中触发隐式类型转换警告:

// ❌ 危险写法(length() 返回 size_t,i 是 int) for (int i = 0; i < str.length() / 2; ++i) { ... } // 当 str.length() == 0 时,str.length()/2 == 0,没问题;但若用 i <= str.length()-1 就可能溢出

更稳妥的是统一用无符号类型或使用迭代器方式。但最省心的做法还是直接用 std::reverse(str.begin(), str.end()) —— 它内部已处理所有边界情况,且编译器通常会优化成高效的汇编指令。

真正容易被忽略的是:std::reverse 对 UTF-8 字符串无效。它按字节反转,不是按 Unicode 码点。处理中文、emoji 时需用 ICU 或其他 Unicode 库,不能依赖这个函数。

text=ZqhQzanResources