c++ - "<"是否满足严格的弱排序意味着不需要 "=="定义?

标签 c++

我不太了解严格弱排序背后的数学原理。但我读过一些东西:

An operator that satisfies strict weak ordering can express all other logical operators

<(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") , 这两个字符串是等价的,但它们的值不相等。

说了这么多。如果您定义的顺序关系暗示了您的类型的所有其他顺序关系,there are tricks从中生成所有其他操作。正如表格所示。

关于c++ - "<"是否满足严格的弱排序意味着不需要 "=="定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51184545/

相关文章:

c++ - 维护一个 std::set<boost::shared_ptr>

c++ - macos 开发qt app 使用rapidjson 如何获取正确的中文?

c++ - 模板函数重载

c++ - 访问私有(private)数据类型

c++ - 存储指向静态变量的指针

c++ - C++ 编译器会通过 `reference` 优化掉未使用的返回值吗?

c++ - Windows 7 NotifyIcon GUID 欺骗保护

c++ - 保持函数参数的 consteval-ness

c++ - CMake target_include_directories不会影响头文件

c++ - 未找到 'vtkPolyDataMapper' 的覆盖