簡體   English   中英

為什么我的for循環會引發“ out_of_range”錯誤?

[英]Why does my for loop throw an “out_of_range” error?

我正在學習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)

我無法解決問題,有人可以告訴我我做錯了什么。

仔細查看錯誤消息:

this-> size()(為0)

該錯誤消息表明傳入的向量為空。 它的size()為0。現在仔細看看for -loop:

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 ++。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM