c++中如何反转字符串_c++ reverse函数实现翻转【常用】

5次阅读

std::reverse不能直接翻转const std::String&,因其要求可写迭代器,而const引用只提供const_iterator;正确做法是用非const的begin()/end()或先拷贝再翻转。

c++中如何反转字符串_c++ reverse函数实现翻转【常用】

std::reverse 为什么不能直接翻转 std::string 的 const 引用

因为 std::reverse 要求传入的是可修改的迭代器范围,而 const std::string&begin()end() 返回 const_iterator,无法满足 std::reverse 对双向迭代器的写入要求。常见错误是写成:

std::string s = "hello";<br>std::reverse(s.cbegin(), s.cend()); // 编译失败:无法赋值

  • 正确做法:用非 const 的 begin()/end() —— 即确保字符串变量本身可修改
  • 如果只有 const 引用,必须先拷贝一份再翻转:
    std::string tmp = original_str;<br>std::reverse(tmp.begin(), tmp.end());
  • std::reverse 是就地翻转,不分配新内存,时间复杂度 O(n),空间 O(1)

std::reverse 翻转子串时下标越界怎么避

手动计算起始/结束位置容易出错,比如想翻转索引 2~5(含)的字符,却写成 std::reverse(s.begin() + 2, s.begin() + 5)——这实际只翻了 [2,5) 共 3 个字符,漏掉索引 5;更糟的是若 s.Length() ,就会触发未定义行为。

  • 安全写法:显式检查边界,再构造迭代器
    if (start <= end && end < s.length()) {<br>  std::reverse(s.begin() + start, s.begin() + end + 1);<br>}
  • 推荐封装成小函数,避免每次重复判断
  • 注意:std::reverse 第二个参数是「尾后迭代器」,不是「最后一个元素的迭代器」

手写 reverse 函数时,for 循环里用 i 还是 <code>i

i 会导致中间字符被交换两次(即还原),最终结果看似正确但多了一次冗余操作;而 <code>i 才是标准终止条件,刚好在指针相遇前停下。

  • 正确模板:
    for (size_t i = 0, j = s.length() - 1; i < j; ++i, --j) {<br>  std::swap(s[i], s[j]);<br>}
  • 当字符串长度为 0 或 1 时,i 自然不成立,循环直接跳过,无需额外判断
  • size_t 要小心减 1 溢出:若 s.empty()s.length() - 1 会变成极大正数,所以最好先判空或改用有符号类型(如 int)做索引

反转 UTF-8 字符串时 std::reverse 会乱码吗

会。c++std::string 是字节容器,std::reverse 按字节翻转,而 UTF-8 中一个汉字占 3 字节,翻转后字节序错乱,解码失败。

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

  • 这不是 std::reversebug,是它本就不该用于多字节编码的逻辑字符翻转
  • 真正需求是「按 Unicode 码点反转」,得先用 ICU、utf8cpp 或 C++20 <charconv></charconv> + std::u8string_view 拆出 code point,再翻转 vector
  • 日常处理 ASCII 文本或已知单字节编码时,std::reverse 安全高效;一旦涉及中文、emoji,就得换方案

实际用 std::reverse 时,最常被忽略的是输入是否真的可写、边界是否真在范围内、以及字符编码是否匹配语义需求。这三个点卡住,比语法错误更难 debug。

text=ZqhQzanResources