6

当我在 C++ 中将函数 .size() 与向量一起使用时,我收到了一个警告 下面是一个示例代码:

vector<classname*> object;
object.push_back(new classname2);

for(int i=0;i<object.size();i++){
....}

我收到警告:

警告 C4018:“<”:有符号/无符号不匹配

我不允许在我的最终代码中有任何错误或警告,所以我需要摆脱这个/找到一个替代方法,我怎样才能摆脱这个?

4

3 回答 3

7

问题是在处理有符号到无符号的比较时可能会出现一个潜在的(破坏性)问题。如果您使用的是 32 位机器,其中有符号int为 4 个字节,则向量的大小可能会超过该类型可表示的最大数量。发生这种情况时,您会得到签名溢出并因此导致未定义的行为。

以下是您可以使用的一些替代方案:

vector<T>::size_type

for (std::vector<classname>::size_type i = 0; i < object.size(); ++i);

这保证是正确的,因为它是size返回的类型。

迭代器

std::vector<classname>::iterator it;

for (it = object.begin(); it != object.end(); ++it);

C++11:基于范围的

for (auto& a : object)
{
     // ...
}

std::size_t

for (std::size_t i = 0; i < object.size(); ++i);

正如末日论者在评论中所说,std::size_t很可能有你的底层平台的位大小。

unsigned int

for (unsigned int i = 0; i < object.size(); ++i);

注意:通过使用它,您假设size返回一个 32 位整数。通常这不是问题,但你不能太确定;如果可以,请使用上述任何一种。

与您的代码相关的另一个提示是使用unique_ptr/的向量shared_ptr来促进内存管理:

std::vector<std::unique_ptr<classname>> object;
于 2013-05-05T17:53:36.490 回答
0

向量的大小始终为正。只需使用 unsigned int 作为循环变量:

for (unsigned int i = 0; i < object.size(); i++)
{
    ...
}

更安全的方法是使用 size_t 声明循环变量,这与大多数平台上的 unsigned int 相同。但是由于它是 vector::size() 函数的返回类型,因此可以保证您的计数器变量具有与向量的可能大小相同的值范围。

for (size_t i = 0; i < object.size(); i++)
{
    ...
}
于 2013-05-05T17:45:26.243 回答
-1

使用无符号迭代器:

for (unsigned int i = 0; i < object.size(); i++)
{

}
于 2013-05-05T17:30:29.077 回答