为什么程序在迭代 c++ 中的 emtpy 向量时抛出运行时错误

Shi*_*arg 4 c++ vector

vector <int> o;    //Empty vector
for(int i=0;i<=o.size()-1;i++) cout<<o[i]; 
Run Code Online (Sandbox Code Playgroud)

在上面得到运行时错误

vector <int> o;  
for(auto j : o){
 cout<<j<<" ";
            } 
Run Code Online (Sandbox Code Playgroud)

但是,如果使用迭代器,则此代码运行良好

Bat*_*eba 14

o.size()C++ 标准要求返回unsigned类型。当它为零时,减去 1std::numeric_limits<decltype(o.size())>::max()就意味着您的循环运行超过了空向量的边界。

for(std::size_t i = 0; i < o.size(); ++i)是显而易见的解决办法。采用<=-1似乎是不真诚做作给我。

  • 初学者经常会遇到“&lt;=”和“-1”的情况。他们尝试使用带有“&lt;=”的“for”循环,发现离一错误并通过添加“-1”来修复它。 (7认同)

120*_*arm 6

o.size()将返回一个 0 的无符号值。从它减去 1 返回一个非常大的正数,本质上是一个无限循环。最终您的越界数组访问o[i]将导致崩溃。

你可以用

for(int i = 0; i <= int(o.size() - 1); i++)
Run Code Online (Sandbox Code Playgroud)

或者只是使用更典型的

for(int i = 0;i < o.size(); i++)
Run Code Online (Sandbox Code Playgroud)

在那里您检查“小于”,而不是“小于或等于”减去一个数字。

  • 我什至不会提及“i &lt;= int(o.size() - 1)”作为可能的解决方案。 (6认同)
  • `int(o.size() - 1` 是什么,这并不是未定义的,它是**实现定义的**。引用自 `[conv.integral]/3` (C++17) _如果目标类型已签名,则如果值可以在目标类型中表示,则该值不变;否则,该值是实现定义的_ (2认同)