我正在学习c ++和测试问题我正在使用带有条件的for循环,prices.size()-1因此向量不会超出范围.
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;
}
Run Code Online (Sandbox Code Playgroud)
但它抛出了这个我无法破译的运行时错误:
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)
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚问题,有人可以告诉我我做错了什么.
仔细查看错误消息:
this-> size()(为0)
错误消息表明传入的向量为空.它size()是0.现在仔细看看for-loop:
for (size_t i = 0; i < prices.size()-1; i++)
Run Code Online (Sandbox Code Playgroud)
我们已经建立了prices.size()0,所以这变得有效:
for (size_t i = 0; i < -1; i++)
Run Code Online (Sandbox Code Playgroud)
但是i是一个size_t无符号类型,因此-1被转换为无符号类型.
现在,自己进行一些实验,看看你从以下语句得到的结果:
std::cout << (size_t)-1 << std::endl;
Run Code Online (Sandbox Code Playgroud)
因此,即使向量为空,for循环的条件仍将评估为true,并且在for循环内,代码将尝试访问不存在的数组值,因此异常.
注意,函数的参数prices与全局prices向量无关.您未显示的程序代码会传入空向量,从而导致出现此错误.为什么传入的向量是空的,这是你需要自己解决的问题.
请注意,调整for-loop 相当容易,只是稍微调整一下,以便正确处理这个边缘情况.只需for按如下方式更改循环的条件:
for (size_t i = 0; i+1 < prices.size(); i++)
Run Code Online (Sandbox Code Playgroud)
即使这看起来是一回事,但事实并非如此(至少在您设法创建一个大约有40亿左右的数组值之前 - 更多的是在64位平台上).欢迎使用C++.