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

C++编写twoSum函数出现No viable overloaded operator[] for vector错误如何解决

错误产生原因

你代码触发编译报错的直接原因是迭代器和下标用法混淆:

  • 循环中定义的auto i = nums.begin(),这里i是vector<int>的迭代器类型,而非整数下标
  • std::vector的[]运算符仅支持传入整数类型的下标参数,没有适配迭代器的重载实现,因此编译器抛出「没有可行的重载[]运算符」错误

此外你的代码还存在两个隐藏问题:

  • 后续temp.push_back(i)操作也属于类型不匹配:twoSum要求返回的是元素下标(整数),你直接插入迭代器不符合vector<int>的元素类型要求
  • 函数如果走完循环未找到匹配结果,没有返回值,会触发编译警告
  • 注:当前逻辑仅能匹配相邻元素和为target的情况,如果你是解决标准两数之和问题(不要求元素相邻),需要额外调整业务逻辑,本回答优先解决编译报错问题。
解决方案

有两种修改思路可以解决编译报错:

方案1:保留迭代器写法,调整取值逻辑

迭代器可以直接通过解引用*获取对应位置的元素,要获取元素下标可以用迭代器减去begin()迭代器得到偏移量,修改后的代码如下:

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        vector<int> temp;
        int p = 0;
        for (auto i = nums.begin(); i != (nums.end() - 1); ++i) {
            cout<<*i;
            // 迭代器解引用获取元素值
            p = *i + *(i+1);
            if ((p) == target) {
                // 迭代器减begin()得到整数下标
                temp.push_back(i - nums.begin());
                temp.push_back((i + 1) - nums.begin());
                return temp;
            }
        }
        // 无匹配结果时返回空容器
        return temp;
    }
};

方案2:改用下标遍历,逻辑更直观

直接用整数作为循环变量遍历下标,完全避免迭代器和下标混用的问题,修改后的代码如下:

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        vector<int> temp;
        int p = 0;
        // 直接用整数下标遍历
        for (int i = 0; i < nums.size() - 1; ++i) {
            cout<<nums[i];
            p = nums[i] + nums[i+1];
            if (p == target) {
                temp.push_back(i);
                temp.push_back(i + 1);
                return temp;
            }
        }
        // 无匹配结果时返回空容器
        return temp;
    }
};

内容的提问来源于stack exchange,提问作者Kshitij Mishra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 16:39:02