C++两数之和代码改为范围for循环后运行错误是什么原因?
问题根因
C++11范围for循环的遍历对象是容器的元素值,而非你预期的数组下标,这是出错的核心原因:
- 你写的C风格循环中外层变量
i是nums的下标,取值依次为0、1、2,符合遍历下标的需求 - 范围for版本中
for (int i : nums )的i取到的是nums存储的元素值,测试用例[2,7,11,15]中i的取值依次为2、7、11、15,完全不符合下标遍历的逻辑 - 返回
[0,0]是因为你初始化返回数组sol时默认两个元素都是0,整个遍历过程没有触发匹配条件,直接返回了初始化的默认值,并非匹配到了下标0和0
修复方案
如果要保留范围for的写法,需要额外手动维护下标变量,修正后的代码如下:
vector<int> twoSumC11(vector<int>& nums, int target) { vector<int> sol(2); bool found = false; int i = 0; // 手动维护外层元素对应的下标 for (int val : nums ){ // val存储当前遍历到的元素值 for ( int x = i + 1; x < nums.size(); x++){ if (val + nums[x] == target) { sol[0] = i; sol[1] = x; found = true; break; } } if (found) break; i++; // 每遍历一个元素,下标自增1 } return sol; }
小提示:范围for更适合仅需要访问元素值、不需要操作下标的场景,需要用到下标做运算的场景,用传统下标循环的可读性会更高。
内容的提问来源于stack exchange,提问作者Anya Volle
相关产品推荐
相关产品推荐

