c+;中向量大小为()的错误C4018+; 我在使用C++中的向量时使用函数sisie()得到警告 下面是一个示例代码: vector<classname*> object; object.push_back(new classname2); for(int i=0;i<object.size();i++){ ....} 矢量对象; 对象。推回(新类名2); 对于(int i=0;i

c+;中向量大小为()的错误C4018+; 我在使用C++中的向量时使用函数sisie()得到警告 下面是一个示例代码: vector<classname*> object; object.push_back(new classname2); for(int i=0;i<object.size();i++){ ....} 矢量对象; 对象。推回(新类名2); 对于(int i=0;i,c++,C++,使用无符号迭代器: for (unsigned int i = 0; i < object.size(); i++) { } for(无符号int i=0;i

使用无符号迭代器:

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

}
for(无符号int i=0;i
向量的大小始终为正。只需使用无符号int作为循环变量:

for (unsigned int i = 0; i < object.size(); i++)
{
    ...
}
for(无符号int i=0;i
更安全的方法是使用size_t声明循环变量,这在大多数平台上与unsigned int相同。但由于它是vector::size()函数的返回类型,因此计数器变量的值范围保证与向量的可能大小相同

for (size_t i = 0; i < object.size(); i++)
{
    ...
}
for(size_t i=0;i
问题在于存在潜在的(断路)处理有符号到无符号比较时可能会遇到的问题。如果您在32位计算机上,有符号的
int
为4字节,则向量的大小可能会超过该类型可表示的最大数量。发生这种情况时,您会出现有符号溢出,从而导致未定义的行为

以下是您可以使用的几个备选方案:

: C++11:: : 注意:通过使用此选项,您假设
size
返回一个32位整数。一般来说,这不是问题,但您不能太确定;如果可以,请使用上面的任何一个选项

与代码相关的另一个技巧是使用
unique\u ptr
/
shared\u ptr
向量来促进内存管理:

std::vector<std::unique_ptr<classname>> object;
std::向量对象;

或for(auto i=0;ifor(auto&value:object){…}
decltype(object)::size\u type
-1:
i
不是
无符号迭代器,它是索引,
size()
不返回
unsigned int
对象(新类名2);
-这是个坏主意。向量不“拥有”该指针,因此您必须手动取消分配它。使用
std::unique_ptr
vector::size()
不会返回
usigned int
,而且大多数桌面操作系统都是64位的,ARM芯片现在也在使用,所以在大多数平台上说size\u t与unsigned int相同也是不准确的。假设
size()
返回整数类型是一个安全的假设。C++03§23.1表65规定它返回
size\u-type
,并且
size\u-type
是一个无符号整数类型。但是,假设它返回与
unsigned int
大小相同的东西不是一个安全的假设。@AdamRosenfield请允许我更正自己:I s应该说是32位整数。因为“无符号整数类型”也可以包括
无符号长
(64位)我会使用
size\u t
作为索引,它更可能具有底层平台的位大小。使用嵌套的
size\u类型
保证是正确的,但它太长而无法写入。
std::vector<classname>::iterator it;

for (it = object.begin(); it != object.end(); ++it);
for (auto& a : object)
{
     // ...
}
for (std::size_t i = 0; i < object.size(); ++i);
for (unsigned int i = 0; i < object.size(); ++i);
std::vector<std::unique_ptr<classname>> object;