c++如何反转字符串_c++ reverse函数反转数组与字符串【示例】

1次阅读

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

c++如何反转字符串_c++ reverse函数反转数组与字符串【示例】

std::reverse 反转字符串的正确用法

直接对 std::String 调用 std::reverse 是安全且高效的,前提是传入合法的迭代器范围。它不关心底层是字符数组还是动态分配的内存,只操作 [begin, end) 区间。

常见错误是传入 C 风格字符串字面量地址,比如 std::reverse("hello", "hello" + 5) —— 这会触发未定义行为,因为字面量存储在只读段。

  • 必须作用于可修改的容器:如 std::stringstd::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 更可靠,尤其当数组含 ‘’ 但不是字符串结尾时。

  • 若数组以 ‘’ 结尾且你只想要反转有效内容,应先用 strlen 获取长度,再构造迭代器范围
  • 若数组不含 ‘’ 或你想反转全部 N 个元素,就用 arrarr + N
  • 切勿对指针变量(如 char* p = new char[10])直接用 sizeof(p) —— 它返回的是指针大小(通常是 8),不是数组长度
char arr[] = "test"; // 实际占 5 字节,含 '' std::reverse(arr, arr + sizeof(arr) - 1); // 反转 "test" 四个字符,保留 '' 在末尾

reverse 函数不适用于 string_view 或 const 字符串

std::string_view 是只读视图,没有所有权,std::reverse 试图写入其指向的内存会导致编译失败(因为 begin() 返回 const_iterator)。同理,任何 const std::string& 也无法直接反转。

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

  • 想反转 std::string_view,得先构造一个 std::stringstd::string(sview).reverse(...) 或用循环手动拷贝
  • 如果原始数据本就是 const char*,必须先复制到可写内存才能反转
  • 没有“只读反转”算法;反转本质是交换操作,必然需要可写访问权限

性能与底层实现:reverse 是就地交换,无额外分配

std::reverse 的时间复杂度是 O(n/2),空间复杂度 O(1),内部通过双指针从两端向中间交换元素。它不依赖容器类型,只要迭代器支持自增、解引用和赋值即可。

  • std::string,它直接操作内部字符缓冲区,不会触发重新分配
  • std::vector<t></t>,只要 T 支持移动或拷贝,就能正常工作
  • 注意:如果元素类型析构/构造开销极大,且你只是临时需要逆序视图,考虑改用反向迭代器(rbegin()/rend())而非真正反转数据

最容易被忽略的一点:反转操作不可逆——除非你事先保存原状态,否则无法恢复。在频繁切换正/逆序访问的场景里,优先用反向迭代器,而不是反复调用 std::reverse

text=ZqhQzanResources