二维数组用两层for循环按行优先遍历最稳妥,外层i从0到rows-1,内层j从0到cols-1;vector需每次调用size()且注意每行长度可能不同,遍历时应先断言非空。

二维数组怎么用两层 for 循环遍历
直接按行优先顺序遍历最稳妥,C++ 里二维数组本质是连续内存块,arr[i][j] 对应第 i 行第 j 列。别想太多指针偏移,老老实实用下标。
- 外层循环控制行号
i,范围是0到rows - 1 - 内层循环控制列号
j,范围是0到cols - 1 - 确保
rows和cols是编译期已知值(比如int arr[3][4]),否则不能用原生数组语法
vector> 怎么安全遍历
动态二维容器不能直接套用原生数组的写法,size() 必须每次调用,因为每行长度可能不同。常见错误是把 vec.size() 当成列数用。
- 外层用
for (size_t i = 0; i - 内层用
for (size_t j = 0; j ,不能假设所有行等长 - 如果确定每行长度一致,可以提前存
const size_t cols = vec.empty() ? 0 : vec[0].size();,但空 vector 要先判
为什么 range-based for 遍历容易出错
写成 for (auto row : vec) 会复制整行,性能差;写成 for (auto& row : vec) 又容易在内层误用 row.size() 却忘了检查 row 是否为空。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 推荐写法:
for (const auto& row : vec) { for (const auto& elem : row) { /* 处理 elem */ } } - 如果需要索引(比如找最大值位置),range-based for 就不适用,必须用传统下标
-
auto推导类型要小心:对vector<vector>></vector>,row类型是vector<int>&</int>,不是int
边界越界和 signed/unsigned 混用的坑
循环变量用 int 而 size() 返回 size_t,一混合就触发隐式转换警告甚至逻辑错误,尤其当 i 减到负数时变成极大正数。
立即学习“C++免费学习笔记(深入)”;
- 统一用
size_t或decltype(vec.size())声明循环变量 - 避免
for (int i = vec.size() - 1; i >= 0; --i)这种写法——vec.size() - 1是无符号,i >= 0永真 - 调试时加一句
assert(!vec.empty() && !vec[0].empty());能省掉很多段错误
实际写的时候,先想清楚你用的是原生数组、std::array 还是 std::vector,三者遍历逻辑相似但边界检查和类型推导规则差得挺远。

















