簡體   English   中英

為什么程序在迭代 c++ 中的 emtpy 向量時拋出運行時錯誤

[英]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_tunsigned ,因此int ( 1 ) 被轉換為size_t

因此,在表達式o.size() - 11被隱式轉換為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.

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