为什么我的for循环会引发“ out_of_range”错误?

时间:2019-01-04 02:18:08

标签: c++

我正在学习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)

我无法解决问题,有人可以告诉我我做错了吗。

1 个答案:

答案 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++)

但是isize_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 ++。