提问人:Cosmo 提问时间:6/23/2022 更新时间:6/24/2022 访问量:330
为什么 C++ 比较不需要整数作为其返回值?
Why does not C++ Compare require an integer as its return value?
问:
根据 C++ 的 Compare 要求,任何类型函数都应该返回一些东西,即如果第一个参数小于第二个参数,否则。这个命名要求用于许多标准算法,例如 、 、 等。然而,他们中的许多人需要判断两个元素是否“相等”。正如参考文献所说,标准库决定了 iff 。显然,判断等价性需要两倍的时间。Compare
true
false
std::sort
std::map
std::set
a == b
!comp(a, b) && !comp(b, a)
众所周知,method 返回一个值,分别用负值、零值和正值表示“less”、“equal”和“greater”。这似乎是一个好主意,只需一次操作即可表达两个值之间的三种可能关系。所以我的问题是,为什么标准库不需要返回整数值或任何其他能够表达至少 3 个独立值的类型?std::string::compare
int
Compare
答:
2赞
Mark Ransom
6/23/2022
#1
通常,算法是编码的,因此您只需要在最后知道一次等价性。因此,需要两个电话而不是一个电话并不是一个不合理的负担。
只需要小于结果使事情变得更简单。bool
3赞
Jeremy Friesner
6/23/2022
#2
我相信这是因为并非所有数据类型都支持进行 -style 三向比较所需的完整语义。std::string::compare
例如,采用类型。这似乎是一个相当不错的三向比较候选者,直到你意识到存在“特殊”浮点值,就像这样既不大于也不小于也不等于任何其他浮点值。目前尚不清楚如果一个三向比较函数的一个或两个操作数是 ;OTOH 函数的预期行为很明确:它应该返回 false。float
NaN
NaN
Compare
评论
0赞
Cosmo
6/23/2022
在我看来,自然是否大于或小于或等于其他值并不重要,重要的是你是否希望它如此。就像@Peter说的一样,是关于订购的。例如,在排序中,如果您希望将所有值放在末尾,那么很明显,您的比较器应该告诉它比任何其他值都大。在许多实践中,我们将两个 s 视为平等,因此我们的比较器可以简单地判断它们是相等的。NaN
Compare
NaN
NaN
NaN
0赞
Jeremy Friesner
6/23/2022
我倾向于同意;但是,我认为标准库的设计者喜欢比你或我更严谨:)
评论
Compare
std::sort()