C++中整型迭代器小于Vector返回大小却不执行循环问题
杨辉三角函数内层循环不执行的问题分析与解决
问题描述
编写返回vector<vector<int>>类型的杨辉三角函数时,发现函数返回空Vector,调试后确认内层for循环从未执行。打印迭代器k的值为-1,res首个元素的size为1,但执行cout << (k < res[i].size()) << endl;输出结果为0。原代码如下:
vector<vector<int>> generate(int numRows) { vector<vector<int>> res = { {1} }; int k; for (int i = 0; i < numRows; i++) { vector<int> c = {}; cout << res[i].size() << endl; for (k = -1; k < res[i].size(); k++) { if (k == -1 || k == res[i].size() - 1) { c.push_back(1); } else { c.push_back(res[i][k] + res[i][k + 1]); } } res.push_back(c); } return res; }
问题根源
核心原因是类型不匹配导致的隐式转换:
res[i].size()返回的是size_t类型(无符号整数,取值范围非负)k是int类型的-1,当无符号整数和有符号整数比较时,int类型会被隐式转换为size_t类型-1转换为size_t后会变成一个极大的正数(例如64位系统中为18446744073709551615),远大于res[i].size()的1,因此k < res[i].size()的结果为false,内层循环直接跳过。
此外原代码还有逻辑冗余:初始res已经包含杨辉三角的第一行{1},外层循环i < numRows会导致最终生成的行数比预期多1行(例如numRows=5会生成6行)。
修正方案
调整循环逻辑,避免负数迭代器和类型不匹配问题,同时修正行数生成逻辑:
vector<vector<int>> generate(int numRows) { if (numRows == 0) return {}; vector<vector<int>> res = {{1}}; // 初始已有1行,只需生成numRows-1行 for (int i = 1; i < numRows; ++i) { vector<int> current_row; current_row.push_back(1); // 行首元素固定为1 // 遍历上一行的相邻元素求和 for (int k = 0; k < res[i-1].size() - 1; ++k) { current_row.push_back(res[i-1][k] + res[i-1][k+1]); } current_row.push_back(1); // 行尾元素固定为1 res.push_back(current_row); } return res; }
修正点说明
- 增加
numRows=0的边界处理,返回空Vector - 外层循环从
i=1开始,循环次数为numRows-1,保证最终生成行数与输入一致 - 内层循环直接遍历上一行的有效索引范围,避免负数迭代器带来的类型转换问题
- 行首和行尾的
1直接单独添加,逻辑更清晰
如果一定要保留原代码的思路,也可以通过显式类型转换解决比较问题:
// 内层循环条件修改为:将size_t转为int,避免无符号转换 for (k = -1; k < static_cast<int>(res[i].size()); k++)
但这种方式不如调整循环逻辑直观,且存在res[i].size()超过int取值范围的潜在风险,不推荐。
内容的提问来源于stack exchange,提问作者Aland Liu
相关产品推荐
相关产品推荐

