错误C4018,带有c ++中的向量大小()

Edd*_*Edd 6 c++

当我使用函数.size()与c ++中的向量时,我得到一个警告下面是一个示例代码:

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

for(int i=0;i<object.size();i++){
....}
Run Code Online (Sandbox Code Playgroud)

我收到警告:

警告C4018:'<':签名/未签名不匹配

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

0x4*_*2D2 7

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

您可以使用以下几种方法:

vector<T>::size_type:

for (std::vector<classname>::size_type i = 0; i < object.size(); ++i);
Run Code Online (Sandbox Code Playgroud)

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

迭代器

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

for (it = object.begin(); it != object.end(); ++it);
Run Code Online (Sandbox Code Playgroud)

C++ 11:基于范围:

for (auto& a : object)
{
     // ...
}
Run Code Online (Sandbox Code Playgroud)

std::size_t:

for (std::size_t i = 0; i < object.size(); ++i);
Run Code Online (Sandbox Code Playgroud)

正如Doomster在评论中所说,std::size_t可能会有你的底层平台的大小.

unsigned int:

for (unsigned int i = 0; i < object.size(); ++i);
Run Code Online (Sandbox Code Playgroud)

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

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

std::vector<std::unique_ptr<classname>> object;
Run Code Online (Sandbox Code Playgroud)