std::reverse反转字符串需作用于可修改容器且传入合法迭代器范围,对只读字符串或字面量调用会触发未定义行为;其时间复杂度o(n/2)、空间复杂度o(1),但不可逆,频繁切换序访问应优先用反向迭代器。

std::reverse 反转字符串的正确用法
直接对 std::string 调用 std::reverse 是安全且高效的,前提是传入合法的迭代器范围。它不关心底层是字符数组还是动态分配的内存,只操作 [begin, end) 区间。
常见错误是传入 C 风格字符串字面量地址,比如 std::reverse("hello", "hello" + 5) —— 这会触发未定义行为,因为字面量存储在只读段。
- 必须作用于可修改的容器:如
std::string、std::vector<char></char>或堆/栈上声明的char[] - 迭代器必须有效且可写:
s.begin()和s.end()是最常用也最安全的选择 - 对空字符串或单字符调用
std::reverse完全合法,无副作用
#include <string>
#include <algorithm>
#include <iostream>
<p>int main() {
std::string s = "world";
std::reverse(s.begin(), s.end()); // ✅ 正确
std::cout << s << "\n"; // 输出: dlrow
}反转 C 风格字符数组(char[])要注意边界
对栈上声明的 char arr[N] 使用 std::reverse 时,必须确保传入的结束迭代器准确指向末尾后一位,不能多也不能少。用 sizeof(arr) 计算长度比用 strlen 更可靠,尤其当数组含 '\0' 但不是字符串结尾时。
- 若数组以 '\0' 结尾且你只想要反转有效内容,应先用
strlen获取长度,再构造迭代器范围 - 若数组不含 '\0' 或你想反转全部 N 个元素,就用
arr和arr + N - 切勿对指针变量(如
char* p = new char[10])直接用sizeof(p)—— 它返回的是指针大小(通常是 8),不是数组长度
char arr[] = "test"; // 实际占 5 字节,含 '\0' std::reverse(arr, arr + sizeof(arr) - 1); // 反转 "test" 四个字符,保留 '\0' 在末尾
reverse 函数不适用于 string_view 或 const 字符串
std::string_view 是只读视图,没有所有权,std::reverse 试图写入其指向的内存会导致编译失败(因为 begin() 返回 const_iterator)。同理,任何 const std::string& 也无法直接反转。
立即学习“C++免费学习笔记(深入)”;
- 想反转
std::string_view,得先构造一个std::string:std::string(sview).reverse(...)或用循环手动拷贝 - 如果原始数据本就是
const char*,必须先复制到可写内存才能反转 - 没有“只读反转”算法;反转本质是交换操作,必然需要可写访问权限
性能与底层实现:reverse 是就地交换,无额外分配
std::reverse 的时间复杂度是 O(n/2),空间复杂度 O(1),内部通过双指针从两端向中间交换元素。它不依赖容器类型,只要迭代器支持自增、解引用和赋值即可。
- 对
std::string,它直接操作内部字符缓冲区,不会触发重新分配 - 对
std::vector<t></t>,只要T支持移动或拷贝,就能正常工作 - 注意:如果元素类型析构/构造开销极大,且你只是临时需要逆序视图,考虑改用反向迭代器(
rbegin()/rend())而非真正反转数据
最容易被忽略的一点:反转操作不可逆——除非你事先保存原状态,否则无法恢复。在频繁切换正/逆序访问的场景里,优先用反向迭代器,而不是反复调用 std::reverse。










