"<"满足严格的弱排序是否意味着不需要"=="定义?
Does "<" satisfies strict weak ordering means that there's no need for "==" definition?
我对严格弱排序背后的数学了解不多。但我读过一些东西:
满足严格弱排序的运算符可以表示所有其他 逻辑运算符
<(a, b) : (a < b) <=(a, b): !(b < a) ==(a, b): !(a < b) && !(b < a) !=(a, b) : (a < b) || (b < a) >(a, b) : (b < a) >=(a, b): !(a < b)
那么这是否意味着不需要"=="定义,因为"<"满足严格的弱排序,可以表达所有的逻辑运算符?(这显然似乎是不正确的,因为我已经看到类定义了<
和==
。
一个易于理解的解释也将非常受欢迎:D。不必太"数学化"或"技术上正确"。
有人可以给我 1 或 2 个(如果很容易找到(标准库基于<
定义其他运算符的示例吗?引用源代码就足够了。
第一件事是第一件事。定义operator <
并不意味着您可以从编译器免费获得operator ==
的定义。它仍然需要显式定义。
上表假定某些内容适用于许多类型和排序关系,但并非适用于所有类型和排序关系。它假定两个要素之间的等价意味着平等。这不一定成立。
我们当然可以使用<
来检查两个元素之间的等价性。根据严格的周排序,它们是等效的(这就是!(a < b) && !(b < a)
的意思(。这并不一定意味着这些元素是相等的。
一个很好的例子是字符串之间的不区分大小写的比较。在这种情况下,我们肯定会有!("ab" < "AB") && !("AB" < "ab")
,并且两个字符串是等价的,但它们的值不相等。
说了这么多。如果您定义的顺序关系意味着您的类型的所有其他顺序关系,则有一些技巧可以从中生成所有其他操作。正如表格所示。
那么这是否意味着不需要"=="定义?
如果您希望类的客户端使用它,您仍然需要定义它。它可以在<
运算符方面实现。就<
运算符而言,实现==
运算符可能更容易。但是,出于性能原因,最好单独干净地实现它。
从代数结构的角度来看,有一种二元关系称为"偏序集合"。偏序集合被定义为自反、反对称和传递的二元关系。
在C++中,可以将bool operator<(a, b)
实现为POS关系操作员。在这种情况下,!(a < b) && !(b < a)
很难被视为等同于平等。一种可能的实现是测试一个节点是否是另一个节点的后代。这是POS关系的完美示例。
- C++评估顺序优化是否意味着对不同的操作数使用不同的内核?
- 聚合类型是否意味着它也是标准布局
- "<"满足严格的弱排序是否意味着不需要"=="定义?
- 如果 std::numeric_limits<float>::is_iec559 为真,这是否意味着我可以以明确定义的方式提取指数和尾数?
- 由于 C++17 支持数组shared_ptr,这是否意味着在 ctor 和重置中不再需要 T[] 的显式删除器?
- 非类型引用参数可以在运行时修改,这是否意味着模板可以在运行时实例化?
- 没有迭代器失效是否意味着推进迭代器的有效性?
- CLOCKS_PER_SEC是否意味着每台计算机都会有不同的时间概念
- c++ friend 关键字是否意味着比访问私有更重要?
- RandomAccessIterator是否意味着数据在内存中是连续的
- 如果 QList 实例是常量,是否意味着每个元素都是常量
- 如果 C# 指针被认为是"unsafe,"这是否意味着C++指针也是"unsafe"?
- final是否意味着覆盖
- 最终C++是否意味着各方面的最终
- 来自 vtable 的未定义符号是否意味着接口和实现之间存在错误
- 分配是否意味着毁灭
- C++ std::binary_search() 然后是 std::lower_bound() 组合是否意味着我正在执行
- ClassName::method()是否意味着调用了ClassName的成员函数method(
- 没有冲突是否意味着一切正常?
- "->"是否意味着取消引用?