用“operator!=()”实现“operator==()”是否更有效,反之亦然

Is it more efficient to implement `operator==()` with `operator!=()` or vice-versa?

本文关键字:operator 有效 反之亦然 实现 是否      更新时间:2023-10-16
在我看来

,对于任何复合对象,在operator==方面实现operator!=都是低效的。对于具有N子对象要比较的对象,operator==必须始终执行其中的每一个比较:当且仅当每个子对象相等时,2 个对象相等。(忽略此讨论中不相关的子对象。

operator!= 相比,在 中,只检查子对象直到找到不匹配就足够了。因此,在复合情况下operator!=委托给operator==是低效的,因为它在每种情况下都会产生 N 个比较,而不仅仅是最坏的情况。

在此评论开始的超长评论讨论之后,这是作为新问题发布的。另一位评论者说:

operator==并不总是需要 N 个比较,

它只需要在最坏的情况下进行 N 个比较,即至少除了最后一个子对象之外的所有子对象都相等时

我看不出这怎么可能是正确的。我错过了什么吗?

这当然比纯粹的C++要通用得多,但由于讨论是特定于此的,因此我保留了相同的标签。

==!= 都将在第一个不满足条件的子对象处停止求值。因此,从一般的角度来看,它们是平等的。

==将评估为:

A==A0 && B==B0 && C==C0 && ....

并在A==A0B==B0C==C0或....评估错误。

!=将评估为:

A!=A0 || B!=B0 || C!=C0 || ...

并在A!=A0B!=B0C!=C0或....评估为真。

在特定情况下,一个可能比另一个更好,但总的来说它们是平等的。

好吧,同样应该适用于==,不是吗?

一旦==运算符发现两个相等的元素,它就可以抓住来比较以下元素,因为对象不能再相等了。