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;