std::reverse是最快最安全的反转方法,直接调用标准库函数,支持vector、原生数组、array等随机访问容器,时间复杂度o(n)且无额外空间开销。

用 std::reverse 最快最安全
直接调用标准库函数是首选,不用手写循环、不担心越界、兼容所有可随机访问的容器(std::vector、原生数组、std::array)。它内部是双指针交换,时间复杂度 O(n),无额外空间开销。
实操建议:
- 对原生数组,必须传入首尾指针:
std::reverse(arr, arr + size);漏掉+ size会只反转第一个元素 - 对
std::vector,用迭代器:std::reverse(vec.begin(), vec.end());别误写成vec.begin() + 1这类偏移 - 头文件别漏:
#include <algorithm></algorithm>,否则编译报‘reverse’ was not declared in this scope
手动实现时注意索引边界
手写双指针翻转常见于面试或嵌入式环境(避免 STL 开销),但极易在边界上出错:比如把循环条件写成 i 导致中间元素被换两次,或用 <code> 却没处理奇偶长度差异。
实操建议:
- 统一用
for (int i = 0, j = n - 1; i —— <code> 是安全下限,无论 <code>n是奇是偶都停在交叉前 - 原生数组传参时,务必确认
n是真实长度,不是sizeof(arr)/sizeof(*arr)在函数内失效后的错误值 - 若元素类型是自定义类,确保赋值/移动操作符正常,否则交换可能静默失败
反转部分子数组的常见误用
想反转从下标 left 到 right(含)的区间时,有人直接传 arr + left 和 arr + right,结果少翻一个元素。
实操建议:
- 右边界要加 1:
std::reverse(arr + left, arr + right + 1) - 手写时检查
right是否>= left,否则循环不执行但无提示;可加 assert 或 if guard - 若
left、right来自用户输入或计算,先做范围校验:if (left = n || left > right) return;
字符串字面量不能反转
写 char s[] = "hello"; std::reverse(s, s + 5); 没问题,但换成 char* s = "hello"; 就会触发段错误 —— 字符串字面量存在只读段。
实操建议:
- 永远用数组声明或
std::string接收字面量:std::string s = "hello";再反转 - 用
const char*仅表示“只读意图”,不代表内存可写;运行时报Segmentation fault (core dumped)时优先查这个 - 工具链开启
-Wwrite-strings能在编译期捕获部分此类问题
C++ 数组反转本身简单,但实际项目里出问题往往不在算法逻辑,而在指针算术的隐式转换、内存权限误判、或 STL 迭代器与原生指针混用时的类型擦除。尤其当代码从 vector 移植到 C 风格数组时,begin()/end() 和 arr/arr+n 的切换最容易漏掉 +n。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











