繁体   English   中英

c ++ 20三路比较运算符的等效和相等之间的区别?

[英]Difference between equivalent and equal for c++20 three way comparison operator?

在 c++20 中引入了新的三路比较运算符 <=>(宇宙飞船运算符),它可以产生以下四个值:

  1. std::strong_ordering::less
  2. std::strong_ordering::equivalent
  3. std::strong_ordering::equal
  4. std::strong_ordering::greater

但是,当我在代码片段下面运行时,似乎相等和等价都是一回事,所以我想知道它们之间的区别是什么,以及在什么情况下我们应该更喜欢一个。

#include <iostream>
#include <compare>
int main()
{
    std::strong_ordering res = (2<=>2);
    if(res == std::strong_ordering::equivalent)
    {
        std::cout<<"Equivalent...."<<std::endl;
    }
    if(res == std::strong_ordering::equal)
    {
        std::cout<<"Equal"<<std::endl;
    }
    return 0;
}

开/关:

相等的....

平等的

正如cppreference所说,两者之间没有区别。 但是, std::strong_ordering是唯一定义equal的类别。 所有其他类别仅定义equivalent

从语言学上讲, equivalent的意思是“按照一定的标准被认为是相等的,但可能有不相关的差异”,而equal的意思是“无法区分”。 因此,平等意味着等价。

当比较考虑到对象的所有属性时,通常使用std::strong_ordering::equal (和equivalent ):

cppreference

暗示可替代性:如果 a 等价于 b,则 f(a) 也等价于 f(b),其中 f 表示一个函数,该函数仅读取可通过参数的公共 const 成员访问的比较显着状态。 换句话说,等效值是无法区分的。

std::{weak,partial}_ordering::equivalent旨在用于不同对象被认为相同但可能具有不相关差异的情况。

它们在数字上和概念上都是一样的。 如果比较在被比较的项目之间产生强排序,则等价和相等是相同的。

之所以有两个词,是因为这对于其他类型的排序是一样的。 弱与偏根本不相等; 它们仅提供等效性。

等价意味着两个对象可以比较相等。 平等意味着更强大的东西; 如果它们比较相等, 则可以在任何 const 用法中替换另一个

只要a == b为真, f(a) == f(b)的属性就为真,其中f表示一个函数,该函数仅读取可通过参数的公共 const 成员访问的比较显着状态。

如果一个类型的比较允许相等(这是强排序的要求),那么它允许相等。 因此,对于强排序比较,它们是相同的。

假设我们正在讨论一个我们将标记为<的排序关系。 现在,对象ab的等价意味着a < bb < a都是假的。 即两者都“不小于”另一个。 平等意味着它们必然共享相同的值,而不仅仅是不按关系排序。

一个典型的例子是不区分大小写的字符串类型。 我们想在不考虑字母大小写的情况下按字典顺序比较字符串。 因此,例如,我们将有"aA" < "aa""aa" < "aA"都是错误的。 在该顺序下,字符串是等价的,但它们肯定不相等。

https://en.cppreference.com/w/cpp/named_req/EqualityComparable

对于既是 EqualityComparable 又是 LessThanComparable 的类型,C++ 标准库对相等性(即表达式 a == b 的值)和等价性(即表达式的值 !(a < b) && !( b < a)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM