在处理 vector.size() 又名 size_type 时,我可以使用一些帮助来澄清这种奇怪的比较
vector<cv::Mat> rebuiltFaces;
int rebuildIndex = 1;
cout << "rebuiltFaces size is " << rebuiltFaces.size() << endl;
while( rebuildIndex >= rebuiltFaces.size() ) {
cout << (rebuildIndex >= rebuiltFaces.size()) << " , " << rebuildIndex << " >= " << rebuiltFaces.size() << endl;
--rebuildIndex;
}
我从控制台得到的是
rebuiltFaces size is 0
1 , 1 >= 0
1 , 0 >= 0
1 , -1 >= 0
1 , -2 >= 0
1 , -3 >= 0
如果我不得不猜测,我会说编译器盲目地将rebuildIndex转换为无符号和+-,但导致事情表现得很奇怪,但我真的不确定。有人知道吗?
正如其他人指出的那样,这是由于
反直觉规则 C++ 适用于比较不同值的值
签名性;该标准要求编译器将两个值转换为unsigned
。因此,通常认为最佳实践是
避免unsigned
除非你正在进行位操作(其中实际的
数值无关)。遗憾的是,标准容器
不要遵循这个最佳实践。
如果你知道向量的大小永远不会溢出int
,那么你可以直接投射结果std::vector<>::size()
to
int
并完成它。然而,这并非没有危险。作为马克
吐温说:“杀死你的不是你不知道的东西,而是你知道的东西。”
确信这不是真的。”如果没有验证,那么
插入到向量中,那么更安全的测试是:
while ( rebuildFaces.size() <= INT_MAX
&& rebuildIndex >= (int)rebuildFaces.size() )
或者如果你真的不希望出现这种情况,并准备中止
发生时,设计(或找到)一个checked_cast
功能,并使用它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)