通过EASTL,我偶然发现了一行特殊的代码。以下链接显示了感兴趣的行号为1870的文件。
https://github.com/paulhodge/EASTL/blob/master/include/EASTL/algorithm.h
该行的代码为if(!(value < *i))
。评论说“我们总是用&lt;或==”来表达价值比较,而不解释为什么会这样。还有一些其他区域放置相同的评论,但没有任何解释。
写这样的比较有什么好处(也许是我忽略的一些背景)?如果没有,为什么EASTL的作者故意以这种特殊的方式写它,甚至小心翼翼地对它发表评论?一致性是唯一的原因吗?
答案 0 :(得分:11)
这意味着您只需要为容器值类型提供<
和==
。它还意味着您可以减少这些类型的可变性(因为所有算法都使用!(a<b)
表示a>=b
和!(a==b)
表示a!=b
);否则,您可能会>=
和!=
返回不一致的结果。
答案 1 :(得分:8)
在C ++中,您可以重载<
运算符,使其行为与>=
的反向运算方式不同,因此不能保证它们等效。
此外,在任何IEEE浮点实现中,NaN < NaN
为false,,但 NaN >= NaN
也是如此,因此即使!(NaN < NaN)
为NaN >= NaN
也是如此是假的。
答案 2 :(得分:1)
我看到至少有一个区别。如果其中一个数字是QNAN(浮点0/0)那么!(a&lt; b)如果a或b中的任何一个是QNAN则总是返回TRUE,而对于&gt; =它总是返回false b'/ p>
答案 3 :(得分:1)
只使用less-than运算符,可以模拟所有其他比较运算符。这使得它更加一致,并允许您在需要参数化比较时使用单个模板参数。标准排序容器和算法使用std::less<T>
作为默认模板比较器。
operation equivalent
x < y x < y
x > y y < x
x <= y !(y < x)
x >= y !(x < y)
x == y !(x < y) && !(y < x)
x != y (x < y) || (y < x)
对于那些排序不重要的操作,使用运算符==
会更简单,更有效。