使用`operator!=()`实现`operator ==()`是否更有效?反之亦然?

时间:2016-09-27 20:45:20

标签: c++

在我看来,对于任何复合对象,根据operator!=实现operator==是低效的。 对于要与N个子对象进行比较的对象,operator==必须总是执行这些比较中的每一个:当且仅当每个子对象相等时,2个对象才相等。 (忽略此讨论中不相关的子对象。)

operator!=比较,只有在找到不匹配时,才能检查子对象。因此,operator!=委托给operator==在复合案例中是低效的,因为它会在每个案例中产生N次比较,而不仅仅是最坏的情况。

this comment开始的长时间评论讨论之后,这是一个新问题。另一位意见提供者说:

  

operator==并不总是需要N次比较,在最坏的情况下只需要进行N次比较,这至少是除了最后一个子对象之外的所有子对象

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

这当然比纯粹的C ++更为通用,但由于讨论是针对我的,所以我保留了相同的标签。

2 个答案:

答案 0 :(得分:6)

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

==将评估为:

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

并在A==A0B==B0C==C0或....评估为假时立即停止。

!=将评估为:

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

并在A!=A0B!=B0C!=C0或....评估为真后立即停止。

在特定情况下,一个可能比另一个好,但一般来说它们是相同的。

答案 1 :(得分:2)

同样应该适用==,不应该吗?

只要==运算符找到两个相等的元素,就可以抓住它来比较以下元素,因为这些对象不再相等。