为什么程序在 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。 从中减去一个返回一个非常大的正数,本质上是一个无限循环。 最终,您的越界数组访问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) { /* ... */ }
相关文章:
- 删除指向指针的指针是运行时错误吗
- c++中的指针和运行时错误
- 无法理解此 return 语句的功能,没有它就会发生运行时错误
- 在同一模拟中使用静脉和静脉_ inet内容时出现运行时错误
- 对单向链表进行排序时出现运行时错误
- 为什么此代码存在运行时错误?
- 你能解释一下什么运行时错误是如何解决它的吗?
- 为什么程序在 c++ 中迭代 emtpy 向量时会抛出运行时错误
- 使用向量将给定表达式转换为波兰表示法时出现运行时错误
- 涉及向量的初学者代码,SEIGSEV运行时错误
- 类中向量的random_shuffle的c++运行时错误
- 在运行时C++将元素插入到向量中.引发运行时错误
- 使用向量时出现奇怪的运行时错误
- 显示向量 (C++) 时出现运行时错误
- 使用字符串向量初始值设定项时,我收到运行时错误"terminate called after throwing instance of `std::length_error`"
- 在SDL_blitsurface中使用 SDL_Rect 向量时出现 c++ 运行时错误
- Igraph 特征向量中心性运行时错误 c++
- 当索引超出向量类的范围时,没有编译错误或运行时错误
- 运行时错误与文件io和向量(c++)
- 向量迭代器擦除给我一个运行时错误