6

通过 EASTL,我偶然发现了一行特殊的代码。以下链接显示了感兴趣的行号为 1870 的文件。

https://github.com/paulhodge/EASTL/blob/master/include/EASTL/algorithm.h

该行的代码是if(!(value < *i)). 评论说“我们总是用 < 或 == 来表达价值比较,而没有任何解释为什么会这样。还有一些其他区域放置了相同的评论但没有任何解释。

写这样的比较有什么好处(也许我忽略了一些上下文)?如果不是,为什么 EASTL 的作者特意写成这样,甚至还特意评论呢?一致性是这里唯一的原因吗?

4

4 回答 4

11

这意味着您只需要为容器值类型提供<和。==这也意味着您减少了这些类型的可变性(因为所有算法都使用!(a<b)meana>=b!(a==b)for a!=b);否则,您可能会得到>=!=返回不一致的结果。

于 2012-01-05T03:18:44.383 回答
8

在 C++ 中,您可以重载<运算符,使其行为不同于相反的>=,因此不能保证它们是等价的。

此外,在任何 IEEE 浮点实现中,NaN < NaN是假的,但也是 NaN >= NaN如此,!(NaN < NaN)即使NaN >= NaN是假的也是真。

于 2012-01-05T03:22:36.877 回答
1

我看到至少一个区别。如果其中一个数字是 QNAN(浮点 0/0),那么如果 a 或 b 中的任何一个是 QNAN,则 !(a < b) 将始终返回 TRUE,而对于 a>=b,它将始终返回 false

于 2012-01-05T03:24:01.583 回答
1

仅使用小于运算符,您可以模拟所有其他比较运算符。这使其更加一致,并允许您在需要参数化比较时使用单个模板参数。例如,标准排序容器和算法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)

对于那些排序不重要的操作,使用运算符更简单,更有效==

于 2012-01-05T03:32:18.283 回答