You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 18:15:03