水平翻转二维数组即对每一行单独执行逆序操作,可用std::reverse或双指针实现,需注意引用修改、边界处理及是否需深拷贝。

水平翻转二维数组就是反转每一行
水平翻转(horizontal flip)在图像处理或矩阵操作中,等价于对二维数组的**每一行单独执行逆序操作**。不是交换行顺序,也不是转置——这点容易混淆。比如 vector<vector>></vector> 中第 0 行从 {1,2,3,4} 变成 {4,3,2,1},第 1 行同理。
用 std::reverse 翻转每行最直接
标准库提供 std::reverse,作用于任意支持随机访问的迭代器区间,对每行调用一次即可:
for (auto& row : matrix) {
std::reverse(row.begin(), row.end());
}
注意几点:
-
row必须是引用(auto&),否则修改的是副本,原数组不变 - 如果
matrix是int arr[M][N]这种 C 风格数组,需手动循环索引:for (int i = 0; i -
std::reverse时间复杂度 O(N) 每行,总开销 O(M×N),空间 O(1)
手写翻转时别越界:常见下标错误
自己写双指针翻转,典型错误是循环条件写成 i 却没处理奇数长度时 <code>i == j 的自交换,或漏掉 ++i/--j 导致死循环。正确写法:
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
for (auto& row : matrix) {
int i = 0, j = row.size() - 1;
while (i <p>关键点:</p>
- 必须用
i ,不是 <code> —— 中间元素无需动 - 每次交换后一定要移动两个指针,否则逻辑卡住
- 若用
size_t做索引,j初始化为row.size() - 1可能溢出(当row为空),建议先判空或改用带符号整型
OpenCV 或 Eigen 用户:别重复造轮子
如果你已在用 OpenCV,cv::flip(mat, dst, 1) 的第三个参数为 1 就是水平翻转;Eigen 中可用 mat.rowwise().reverse()。这些封装内部仍是逐行逆序,但省去边界检查和模板适配成本。
真正容易被忽略的是:翻转操作是否需要深拷贝?如果后续还要用原数组,而你传入的是引用并原地修改,就得提前 auto copy = matrix; —— 原地修改不可逆,且没有“撤销”接口。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










