当我在 C++ 中将函数 .size() 与向量一起使用时,我收到了一个警告 下面是一个示例代码:
vector<classname*> object;
object.push_back(new classname2);
for(int i=0;i<object.size();i++){
....}
我收到警告:
警告 C4018:“<”:有符号/无符号不匹配
我不允许在我的最终代码中有任何错误或警告,所以我需要摆脱这个/找到一个替代方法,我怎样才能摆脱这个?
当我在 C++ 中将函数 .size() 与向量一起使用时,我收到了一个警告 下面是一个示例代码:
vector<classname*> object;
object.push_back(new classname2);
for(int i=0;i<object.size();i++){
....}
我收到警告:
警告 C4018:“<”:有符号/无符号不匹配
我不允许在我的最终代码中有任何错误或警告,所以我需要摆脱这个/找到一个替代方法,我怎样才能摆脱这个?
问题是在处理有符号到无符号的比较时可能会出现一个潜在的(破坏性)问题。如果您使用的是 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);
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;
向量的大小始终为正。只需使用 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++)
{
...
}
使用无符号迭代器:
for (unsigned int i = 0; i < object.size(); i++)
{
}