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

Why program throws runtime error while iterating over an emtpy vector in c++

本文关键字:运行时错误 向量 emtpy 程序 c++ 迭代 为什么      更新时间:2023-10-16
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。 从中减去一个返回一个非常大的正数,本质上是一个无限循环。 最终,您的越界数组访问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() - 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) { /* ... */ }