最快最安全的方法是直接调用 std::reverse,时间复杂度 o(n)、空间 o(1),对随机访问容器通用;需传首尾指针(如 arr, arr+5),不可传数组名或 sizeof(arr)。

用 std::reverse 最快最安全
直接调用 std::reverse 是 C++ 标准做法,它专为就地反转设计,时间复杂度 O(n),空间 O(1),且对任意支持随机访问的容器(包括原生数组)都有效。
注意:必须传入指针(即数组首尾地址),不能传数组名本身——因为数组名退化为指针后丢失长度信息,std::reverse 无法知道边界。
- 对
int arr[5] = {1,2,3,4,5};,正确写法是std::reverse(arr, arr + 5); - 若用
std::vector,可直接传v.begin()和v.end() - 别写成
std::reverse(arr, arr + sizeof(arr))——sizeof(arr)返回字节数,不是元素个数
手写双指针循环要注意边界条件
自己实现时核心是交换首尾元素并收缩区间,但容易在循环终止条件上出错,尤其当数组长度为奇数或零时。
- 推荐用
left 作为 while 条件,不是 <code>left ——后者会导致中间元素被 swap 两次(等效于没变)或越界访问 - 对空数组或单元素数组,
left 一开始就为 false,循环不执行,天然安全 - 示例:
for (int i = 0, j = n - 1; i
用 std::span(C++20)避免裸指针长度误传
裸数组传参时长度信息易丢失或写错,std::span 把数据和长度绑在一起,让 std::reverse 调用更健壮。
-
std::span<int> s(arr);</int>自动推导长度;然后std::reverse(s.begin(), s.end()); - 函数参数改用
std::span<const t></const>或std::span<t></t>,比T*+size_t更清晰、不易错 - 老标准(C++17 及以前)没有
std::span,可用gsl::span替代,但需引入第三方头文件
常见错误:把数组名当 std::array 或误用 std::reverse_copy
std::reverse_copy 不是就地操作,它需要目标缓冲区,且不会修改原数组;而 std::array 是类模板,有 .begin()/.end(),但普通 C 风格数组没有。
- 写
std::reverse_copy(arr, arr + n, arr)看似“就地”,实则未定义行为——源和目标重叠,标准不保证正确性 - 写
std::reverse(arr.begin(), arr.end())会编译失败,因为int arr[5]没有.begin()成员函数 - 若真要用
std::array,得显式声明为std::array<int> a = {1,2,3,4,5};</int>,再调用std::reverse(a.begin(), a.end())
就地反转真正关键的不是算法逻辑,而是怎么把长度信息可靠地和指针一起传递过去——漏掉这个,哪怕双指针写得再漂亮,传进 std::reverse 也会崩。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











