与矢量大小一起使用时for循环中的错误

时间:2014-04-04 17:07:12

标签: c++

这是我编写的示例代码。 我现在退出如下,

size 0
Here

为什么即使myVec.size的值为零,此代码也会进入for循环

#include <iostream>
#include <vector>
using namespace std;

int main()
{
  vector<int> myVec;
  cout <<" size  " << myVec.size() << endl;
  for (int i=0; i<myVec.size() -1; i++)
  {
   cout << " Here  " << endl;
   break;
  }
  return 0;
}

2 个答案:

答案 0 :(得分:6)

size()返回无符号类型。对于无符号类型,0 - 1“下溢”到最大值。由于i小于它转换为的类型的最大可能值,因此输入for循环。

答案 1 :(得分:3)

您的问题显示为什么通常最好避免使用unsigned数字,而这些数字不能为负数&#34;为什么标准图书馆课程不遵守本指南是不幸的。请参阅Scott Meyers的Signed and Unsigned Types in Interfaces

由于myVec为空,其大小为0,而您的myVec.size() - 1表达式变为0 - 1,如果类型已签名,则为-1。但是,它是未签名的,因此它变成了一个巨大的正数。

在C ++ 98/03中,迭代向量的更好方法是使用迭代器:

for (std::vector<int>::const_iterator iter = myVec.begin(); iter != myVec.end(); ++iter)
{
    int i = *iter;
}

在C ++ 11中,可以更简洁地编写:

for (auto iter = myVec.begin(); iter != myVec.end(); ++iter)
{
    int i = *iter;
}

甚至更好,使用基于范围的for循环:

for (auto i : myVec)
{
}