与矢量大小一起使用时,for 循环中出错

error in for loop, when using with vector size

本文关键字:for 循环 出错 一起      更新时间:2023-10-16

这是我编写的示例代码。我出去放如下,

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;
}

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

您的问题表明,为什么通常最好避免对"不能为负数"的数字进行unsigned,以及为什么不幸的是标准库类不符合本指南。请参阅 Scott Meyers 的接口中的有符号和无符号类型。

由于 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)
{
}