std::reverse 是最快最安全的反转方法——专为反转设计,时间复杂度 o(n),适用于 c 风格数组、vector 和 array,需传入迭代器范围(右边界为尾后迭代器),并包含 头文件。

用 std::reverse 最快最安全
绝大多数情况下,直接调用 std::reverse 是最优解——它专为此设计,底层通常用指针交换实现,时间复杂度 O(n),且不依赖数组是否连续或是否为原生数组。
注意:必须包含头文件 <algorithm></algorithm>;参数是迭代器范围,不是数组本身。
- 对 C 风格数组:
int arr[] = {1,2,3,4}; std::reverse(arr, arr + 4); - 对
std::vector:std::reverse(vec.begin(), vec.end()); - 对
std::array同样适用:std::reverse(arr.begin(), arr.end());
别传错右边界:第二个参数是「尾后迭代器」,不是最后一个元素的地址。传 arr + sizeof(arr)/sizeof(arr[0]) 或用 std::size(arr)(C++17+)更稳妥。
手写循环交换要注意索引边界
手动实现时最容易犯的错是循环条件写成 i 或漏掉整数除法截断,导致越界或少交换一次。
假设数组长度为 n,只需遍历前半段,下标从 0 到 n/2 - 1(整除),每次交换 arr[i] 和 arr[n-1-i]。
- 正确写法:
for (int i = 0; i - 如果用
int类型长度,n为奇数时中间元素不动,这是预期行为 - 避免用
i —— 在 <code>n=1时可能让i=0进入循环但交换自己,虽无害但逻辑冗余
反转 std::vector 时别误用 std::reverse_copy
std::reverse_copy 不修改原容器,而是把反转结果拷贝到另一段内存。如果目标空间没提前分配或大小不足,会触发未定义行为。
- 错误示例:
std::vector<int> dst; std::reverse_copy(src.begin(), src.end(), dst.begin());</int>→dst为空,写入越界 - 正确做法:要么先
dst.resize(src.size()),要么用std::back_inserter(dst) - 真要原地反转,就别碰
_copy版本——名字带copy就意味着不就地操作
C++20 起可用 std::ranges::reverse 简化写法
如果你项目已启用 C++20,std::ranges::reverse 支持直接传容器,不用再算迭代器:
-
std::ranges::reverse(arr);// C 风格数组 -
std::ranges::reverse(vec);// vector、array、string_view 等都行 - 背后仍调用
std::reverse,只是接口更直觉;但需包含<algorithm></algorithm>和开启 C++20 标准
老项目若不能升级标准,就别强求 ranges 版本——可读性提升有限,反而增加兼容性负担。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











