[英]Why program throws runtime error while iterating over an emtpy vector in c++
vector <int> o; //Empty vector
for(int i=0;i<=o.size()-1;i++) cout<<o[i];
在上面得到運行時錯誤
vector <int> o;
for(auto j : o){
cout<<j<<" ";
}
但是,如果使用迭代器,則此代碼運行良好
C++ 標准要求o.size()
返回unsigned
類型。 當它為零時,減 1 產生std::numeric_limits<decltype(o.size())>::max()
這意味着您的循環運行超過空向量的邊界。
for(std::size_t i = 0; i < o.size(); ++i)
是顯而易見的解決方法。 <=
和-1
的使用在我看來幾乎是不誠實的。
o.size()
將返回一個無符號值 0。從它減去 1 返回一個非常大的正數,本質上是一個無限循環。 最終,您對o[i]
的越界數組訪問將導致崩潰。
你可以用
for(int i = 0; i <= int(o.size() - 1); i++)
或者只是使用更典型的
for(int i = 0;i < o.size(); i++)
在那里您檢查“小於”,而不是“小於或等於”減去一個數字。
由於sizeof(size_t)
大於或等於sizeof(int)
(盡管這可能取決於實現)並且size_t
是unsigned
,因此int
( 1
) 被轉換為size_t
。
因此,在表達式o.size() - 1
, 1
被隱式轉換為size_t
,並且o.size() - 1
(相當於size_t(0 - 1)
)變得等於std::numeric_limits<size_t>::max()
。 因此,進入for
循環並訪問索引0
處的空o
導致未定義的行為。
你應該:
for (size_t idx = 0; idx < o.size(); ++idx) { /* ... */ }
如果出於某種原因您需要索引的類型為int
,您可以:
for (int idx = 0; idx < static_cast<int>(o.size()); ++idx) { /* ... */ }
或在您的示例中(不太常見):
for (int idx = 0; idx <= static_cast<int>(o.size()) - 1; ++idx) { /* ... */ }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.