在我看来,对于任何复合对象,根据operator!=
实现operator==
是低效的。
对于要与N
个子对象进行比较的对象,operator==
必须总是执行这些比较中的每一个:当且仅当每个子对象相等时,2个对象才相等。 (忽略此讨论中不相关的子对象。)
与operator!=
比较,只有在找到不匹配时,才能检查子对象。因此,operator!=
委托给operator==
在复合案例中是低效的,因为它会在每个案例中产生N次比较,而不仅仅是最坏的情况。
在this comment开始的长时间评论讨论之后,这是一个新问题。另一位意见提供者说:
operator==
并不总是需要N次比较,在最坏的情况下只需要进行N次比较,这至少是除了最后一个子对象之外的所有子对象
我看不出这怎么可能是正确的......我错过了什么?
这当然比纯粹的C ++更为通用,但由于讨论是针对我的,所以我保留了相同的标签。
答案 0 :(得分:6)
==
和!=
都会在不满足条件的第一个子对象上停止评估。因此,从一般的角度来看,它们是平等的。
==
将评估为:
A==A0 && B==B0 && C==C0 && ....
并在A==A0
或B==B0
或C==C0
或....评估为假时立即停止。
!=
将评估为:
A!=A0 || B!=B0 || C!=C0 || ...
并在A!=A0
或B!=B0
或C!=C0
或....评估为真后立即停止。
在特定情况下,一个可能比另一个好,但一般来说它们是相同的。
答案 1 :(得分:2)
同样应该适用==
,不应该吗?
只要==
运算符找到两个不相等的元素,就可以抓住它来比较以下元素,因为这些对象不再相等。