std::reverse是最直接安全高效的方式,原地反转std::string字符序列,时间O(n)空间O(1),需包含;不可对只读C字符串字面量直接使用;仅倒序输出时应优先用rbegin/rend。

std::reverse 是最直接、安全且高效的方式,不用手写循环或额外容器。
用 std::reverse 倒序 std::string
它原地反转迭代器范围,对 std::string 就是反转整个字符序列:
std::string s = "hello"; std::reverse(s.begin(), s.end()); // s 变成 "olleh"
- 必须包含头文件
-
s.begin()和s.end()是双向迭代器,std::reverse要求至少是双向迭代器,std::string满足 - 时间复杂度 O(n),空间 O(1),无拷贝开销
- 注意:
s.end()是末尾后一位,这是标准用法,别写成s.begin() + s.size()—— 虽然等价,但可读性差且易错
倒序 C 风格字符串(char*)要小心
不能直接对字面量(如 "hello")调用 std::reverse,因为它们是只读的常量内存:
const char* s = "hello"; std::reverse(s, s + 5); // ❌ 运行时崩溃(段错误)
- 正确做法:先复制到可修改的缓冲区,例如
std::vector或栈数组 - 例如:
char buf[] = "hello"; std::reverse(buf, buf + 5);✅ - 若用
std::string接收字面量,再反转,更安全:std::string s = "hello"; std::reverse(s.begin(), s.end());
想“倒序输出”但不修改原字符串?别用 std::reverse
如果只是打印或遍历逆序结果,没必要改原始数据。这时用反向迭代器更轻量:
立即学习“C++免费学习笔记(深入)”;
std::string s = "hello";
for (auto it = s.rbegin(); it != s.rend(); ++it) {
std::cout << *it;
} // 输出 olleh-
rbegin()/rend()不改变字符串,也不分配内存 - 适用于只读场景,比如日志、调试、拼接前临时查看
- 若后续还要用正向顺序,避免无谓的
std::reverse再反转回来
真正容易被忽略的是:std::reverse 对空字符串、单字符字符串完全安全,但对 std::string_view 无效——它没有可修改的数据;若你传入的是 std::string_view,得先转成 std::string 或用反向遍历。










