我正在学习c ++,并且为了测试问题,我使用条件为prices.size()-1
的for循环,因此向量不会超出范围。
std::vector<int> prices {7,1,5,3,6,4};
int maxProfit(vector<int>& prices) {
int total {0};
for (size_t i = 0; i < prices.size()-1; i++) {
if (prices.at(i+1) > prices.at(i)) {
total += prices.at(i+1) - prices.at(i);
}
}
return total;
}
但是它抛出了这个我无法解读的运行时错误:
terminate called after throwing an instance of 'std::out_of_range' what(): vector::_M_range_check: __n (which is 1) >= this->size() (which is 0)
我无法解决问题,有人可以告诉我我做错了吗。
答案 0 :(得分:5)
仔细查看错误消息:
this-> size()(为0)
该错误消息指示传入的向量为空。它的size()
为0。现在仔细看看for
循环:
for (size_t i = 0; i < prices.size()-1; i++)
我们已经确定prices.size()
为0,因此有效地变为:
for (size_t i = 0; i < -1; i++)
但是i
是size_t
,它是无符号类型,因此-1被强制转换为无符号类型。
现在,您自己进行一些实验,看看您从以下语句中得到什么输出:
std::cout << (size_t)-1 << std::endl;
因此,即使向量为空,for
循环的条件仍将求值为true
,并且在for循环内,代码将尝试访问不存在的数组值,因此是例外。
请注意,函数prices
的参数与全局prices
向量无关。您程序中未显示的代码以空向量传递,从而导致此错误。为什么传入的向量为空,这是您需要自己弄清楚的东西。
请注意,只需稍微调整一下for
循环,就很容易了,这样就可以正确处理这种情况。只需更改for
循环的条件,如下所示:
for (size_t i = 0; i+1 < prices.size(); i++)
即使这似乎是同一回事,但事实并非如此(至少直到您设法创建一个具有约40亿个值的数组-在64位平台上更多)。欢迎使用C ++。