std::reverse 是翻转 int 数组最快最安全的标准方法,接受迭代器范围原地逆序,时间 O(n)、空间 O(1),需包含 <algorithm>,正确用法为 std::reverse(arr, arr + n) 或 vec.begin()/end()。

用 std::reverse 最快最安全
直接调用 std::reverse 是 C++ 里翻转 int 数组的标准做法,不用手写循环,也不用担心越界。它接受两个迭代器,把区间内元素原地逆序,时间复杂度 O(n),空间 O(1)。
常见错误是传错迭代器范围:比如把 end 写成数组长度,或对指针数组误用 &arr[0] 和 &arr[n] 而不是 arr 和 arr + n。
- 对栈上数组:
std::reverse(arr, arr + n); - 对
std::vector<int>:std::reverse(vec.begin(), vec.end()); - 别传
std::reverse(arr, arr + n - 1)——这会漏掉最后一个元素 - 头文件必须包含
<algorithm>,否则编译报‘reverse’ is not a member of ‘std’
手动翻转要注意索引边界
如果不用 STL(比如嵌入式环境没开 STL,或想练手),就得自己交换首尾。关键点是循环只跑到一半,且下标计算别越界。
典型翻车现场:循环条件写成 i <= n/2 导致中间元素多换一次;或者用 i < n 配合 j = n - i,结果 j 下标溢出。
- 正确写法:
for (int i = 0; i < n / 2; ++i) std::swap(arr[i], arr[n - 1 - i]); n必须是实际元素个数,不能是sizeof(arr)(对指针无效)- 用
std::swap比直接赋值更安全,尤其后续可能换成自定义类型 - 注意整数除法:
n=5时n/2是 2,刚好停在索引 0↔4、1↔3,中间的 2 不动
用 std::array 时别忘模板参数
如果数组是 std::array<int, 5> 这种固定大小容器,std::reverse 依然能用,但得传它的迭代器,不是裸指针。
容易忽略的是:模板大小必须显式写出,std::array 无法从初始化列表自动推导尺寸(C++17 以前),而且 .data() 返回的是 int*,跟普通数组用法一致,但新手常以为要解引用或取地址。
- 正确:
std::reverse(a.begin(), a.end());或std::reverse(a.data(), a.data() + a.size()); - 错误:
std::reverse(&a, &a + 1)—— 这是在翻转整个std::array对象,不是内部元素 - 错误:
std::reverse(a, a + a.size())——a不是指针,不能做算术运算
反转后访问越界问题比想象中常见
翻转本身不引发运行时错误,但后续逻辑可能依赖原顺序,比如某个下标被硬编码为“取最后一个元素”,翻转后它就变成第一个了。
更隐蔽的是:数组作为函数参数传入时,退化成指针,sizeof 失效,n 必须额外传入。如果忘记传或传错,std::reverse 就会翻转错误长度,轻则数据错乱,重则踩内存。
- 函数签名建议写成:
void reverse_ints(int* arr, size_t n),别依赖全局变量或宏定义的长度 - 用
std::vector或std::array可自带长度信息,减少这类隐患 - 调试时如果发现翻转后输出全是 0 或乱码,先检查
n是否为 0 或远超实际大小
事情说清了就结束。