定义和使用运算符
运算符 < = > 是一个新的二进制运算符。它是为所有基本数据类型定义的,关系运算符是为这些数据类型定义的。
运算符 < = > 优先于所有其他比较运算符,因此您需要用括号在输出语句中使用它,但不需要将其结果与另一个值进行比较:
std::cout <<(0<x<=>y)<<'\n'; //calls0 <(x<=> y)
请注意,您必须包含一个特定的头文件来处理运算符 < = > :
#include <compare>
但是,大多数标准类型(字符串、容器、 < 实用程序 >)的头文件都包含这个头文件。若要对不需要此标头的值或类型调用运算符,必须包括 <compare> 例如:
#include <compare> //for calling <=>
auto x = 3 <=>4; // 没有头 < compare > 就不能编译
运算符 < = > 不返回布尔值。相反,它的作用类似于三向比较,产生负值表示信号少,正值表示信号大,0表示信号相等或等价。这种行为类似于 C 函数 strcmp ()的返回值; 但是,有一个重要的区别:
返回值不是整数值。相反,C++标准程式库提供了三种可能的返回类型,它们反映了比较的类别。
比较运算符
-
当我们比较两个数值来把它们按顺序排列时,我们可能会发生不同类别的行为:
对于强排序(也称为总排序) ,给定类型的任何值要么小于、等于或大于此类型的任何其他值(包括其本身)。
此类别的典型例子是整数值或常见的字符串类型。
如果一个值既不小也不大,那么它必须等于。如果你有多个对象,我可以按升序或降序对它们进行排序(相等的值之间有任何顺序)。
-
对于弱排序,给定类型的任何值都小于或等于或大于此类型的任何其他值(包括它本身)。但是,等效值不必相等(具有相同的值)。
此类别的一个典型示例是不区分大小写的字符串类型。字符串“ hel1o”小于“ hello1”,大于“ he11”。然而,“ HELLO”等价于“ HELLO”,尽管这两个字符串不相等。
如果一个值既不小也不大,那么它必须是等价的。如果您有多个对象,您可以按升序或降序对它们进行排序(使用等效的值相互之间按任意顺序排列)。
-
使用分部排序,给定类型的任何值都可以小于或等效于或大于此类型的任何其他值(包括其本身)。但是,也可能发生无法在两个值之间指定特定顺序的情况。
此类别的一个典型示例是浮点类型,因为它们可能具有特殊值 NaN (“非数字”)。与 NaN 的任何比较都是错误的。因此在这种情况下,比较可能产生两个值是无序的,比较运算符可能返回四个值中的一个。
如果有多个对象,则可能无法按升序或降序对它们进行排序(除非确保不能排序的值不存在)。
标准库中的运算符类型
对于不同的比较运算符,C + + 20标准引入了以下类型:
std::strong_ordering with the values:
- std::strong_ordering::less
- std::strong_ordering::equal
(also available as std: : strong_ordering: : equivalent)
- std::strong_ordering::greater
std::weak_ordering with the values:
- std::weak_ordering::less
- std::weak_ordering::equivalent
- std::weak_ordering::greater
std::partial_ordering with the values:
- std::partial_ordering::less
- std::partial_ordering::equivalent
- std::partial ordering::greater
- std::partial_ordering: :unordered
请注意,所有类型的值都较小、较大和等效。但是,strong _ ordering 也有相等的值,这与那里的等价值相同,而 part _ ordering 有无序的值,它既不表示小,也不表示等,更不表示大。
较强的比较类型具有到较弱比较类型的隐式类型转换。这意味着您可以使用任何 strong _ ordering 值作为弱排序或局部排序值(然后等于等价)。
开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 N 天,点击查看活动详情”