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
相关产品推荐
相关产品推荐

