用“operator!=()”实现“operator==()”是否更有效,反之亦然
Is it more efficient to implement `operator==()` with `operator!=()` or vice-versa?
在我看来
,对于任何复合对象,在operator==
方面实现operator!=
都是低效的。对于具有N
子对象要比较的对象,operator==
必须始终执行其中的每一个比较:当且仅当每个子对象相等时,2 个对象相等。(忽略此讨论中不相关的子对象。
与 operator!=
相比,在 中,只检查子对象直到找到不匹配就足够了。因此,在复合情况下operator!=
委托给operator==
是低效的,因为它在每种情况下都会产生 N 个比较,而不仅仅是最坏的情况。
在此评论开始的超长评论讨论之后,这是作为新问题发布的。另一位评论者说:
operator==
并不总是需要 N 个比较,它只需要在最坏的情况下进行 N 个比较,即至少除了最后一个子对象之外的所有子对象都相等时
我看不出这怎么可能是正确的。我错过了什么吗?
这当然比纯粹的C++要通用得多,但由于讨论是特定于此的,因此我保留了相同的标签。
==
和 !=
都将在第一个不满足条件的子对象处停止求值。因此,从一般的角度来看,它们是平等的。
==
将评估为:
A==A0 && B==B0 && C==C0 && ....
并在A==A0
或B==B0
或C==C0
或....评估错误。
!=
将评估为:
A!=A0 || B!=B0 || C!=C0 || ...
并在A!=A0
或B!=B0
或C!=C0
或....评估为真。
在特定情况下,一个可能比另一个更好,但总的来说它们是平等的。
好吧,同样应该适用于==
,不是吗?
一旦==
运算符发现两个不相等的元素,它就可以抓住来比较以下元素,因为对象不能再相等了。
相关文章:
- 欧拉项目#8答案是大以获得有效答案
- 调整大小后指向元素值的指针unordered_map有效?
- 为什么是0;C++中的有效语句
- 最高有效数字侧的第N位
- GCC对可能有效的代码抛出init list生存期警告
- 有效地使用std::unordered_map来插入或增加键的值
- c++中O(n^(1/3))中一个数的除数的有效计数
- 使用无符号字符数组有效存储内存
- 自定义先决条件对移动分配运算符有效吗
- 为什么 std::optional::operator=(U&&) 要求你是非标量类型?
- 'operator='已弃用:改用 QDir::setPath()
- 过载'operator new'如何导致无限循环?
- 为什么将值返回函数传递给重载=运算符对运算符函数有效,而对其他运算符无效
- 有哪些有效的方法可以消除一组 100 万个字符串>重复数据?
- 为什么这种直接初始化有效?(C++17)
- 递归函数有效,但无法记忆
- 在C++中初始化向量映射的最有效方法
- 如果变量名称不跟在 char* 后面,const char* 是否有效?
- 钳制迭代器是否有效
- 用“operator!=()”实现“operator==()”是否更有效,反之亦然