std::reverse是最直接可靠的方式,底层用双向迭代器交换,时间复杂度O(n)、零额外空间,适用于vector、原生数组和array,需传首尾迭代器且右边界为end()。

用 std::reverse 是最直接可靠的方式
标准库的 std::reverse 就是为此设计的,底层是双向迭代器交换,时间复杂度 O(n),无额外空间开销,且对所有连续存储容器(std::vector、原生数组、std::array)都适用。
注意它操作的是迭代器范围,不是容器本身,所以调用时得传首尾迭代器:
#include <algorithm>
#include <vector>
#include <iostream>
<p>std::vector<int> v = {1, 2, 3, 4, 5};
std::reverse(v.begin(), v.end()); // 反转后 v 变成 {5,4,3,2,1}
- 对原生数组要用指针:
std::reverse(arr, arr + n) - 对
std::array同样用.begin()和.end() - 别传错右边界——
v.end()是合法的,但v.end() - 1会漏掉最后一个元素参与交换
手写循环反转要注意索引边界和类型匹配
手动实现不难,但容易在边界上出错,尤其当数组长度为奇数或 0/1 时。核心逻辑是交换 i 和 n - 1 - i,只遍历前半段即可。
for (int i = 0; i < n / 2; ++i) {
std::swap(arr[i], arr[n - 1 - i]);
}
-
n / 2是整除,自动处理奇偶性(如 n=5 → i 走 0、1,中间元素不动) - 用
size_t做索引时,n - 1 - i可能下溢(n=0 时n-1变成极大正数),建议统一用带符号整型如int或ptrdiff_t - 如果数组是 const 的,或者只想获取反转后的新副本,就得另开空间并反向拷贝
反转字符串字面量或 std::string 不能直接用 std::reverse?
可以,而且推荐。但要注意字符串字面量(如 "hello")是只读的,不能直接传给 std::reverse 修改;必须先存进可修改容器里。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
立即学习“C++免费学习笔记(深入)”;
- 错误写法:
std::reverse("hello", "hello" + 5)—— 编译可能过,运行时崩溃(试图改只读内存) - 正确写法:
std::string s = "hello"; std::reverse(s.begin(), s.end()); -
std::string内部是连续内存,std::reverse效率完全没问题,不用自己写循环
性能差异几乎可以忽略,但 std::reverse 更安全
手写循环和 std::reverse 在优化后的机器码层面几乎一样——现代编译器能把 std::reverse 内联展开成等效汇编。真正差别在于可读性和健壮性:
-
std::reverse经过大量测试,处理空容器、单元素、move-only 类型都正确 - 手写循环若忘了
++i或写错终止条件,容易死循环或越界 - 如果数组元素类型重载了
std::swap或有移动语义,std::reverse能自动利用,而裸swap调用可能退化成拷贝
除非你在写裸机固件或极端受限环境,否则没理由绕过 std::reverse。它不是“高级技巧”,就是标准答案。

















