[英]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.