当我使用函数.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:'<':签名/未签名不匹配
我不允许在我的最终代码中有任何错误或警告,所以我需要摆脱这个/找到一个替代方法,我怎么能摆脱这个?
问题是在处理签名到无符号比较时可能会产生一个潜在的(破坏)问题.如果您使用的是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)
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)