提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
三向比较运算符可用于确定两个值的大小顺序。它也被称为太空飞船运算符。
使用单个表达式,它可以告诉你一个值是否等于、小于或大于另一个值。因为它必须返回的不仅是true或者false,所以它不能范围布尔类型。相反,他返回类枚举(enumeration-like)类型(不是真正的枚举类型,不能应用于switch),定义在和std名称空间中。
一、整形操作数
如果操作数是整形,结果是所谓的强排序,并可以是一下之一。
strong_ordering::less 第一个操作数小于第二个操作数
strong_ordering::greater 第一个操作数大于第二个操作数
strong_ordering::equal 第一个操作数等于第二个操作数
int i{11};
strong_ordering result{i <=> 0};
if(result == strong_ordering::less){ cout<< "less" << endl; }
if(result == strong_ordering::greater){ cout<< "greater" << endl; }
if(result == strong_ordering::equal){ cout<< "equal" << endl; }
二、浮点型操作数
如果操作数是浮点型,结果是一个偏序。
partial_ordering::less 第一个操作数小于第二个操作数
partial_ordering::greater 第一个操作数大于第二个操作数
partial_ordering::equivalent第一个操作数等于第二个操作数
partial_ordering::unordered 两个操作数中有非数字
int i{5.5};
partial_ordering result{i <=> 1.1};
if(result == partial_ordering::less){ cout<< "less" << endl; }
if(result == partial_ordering::greater){ cout<< "greater" << endl; }
if(result == partial_ordering::equivalent){ cout<< "equivalent" << endl; }
三、自定义类型
还有一种弱排序,针对自己定义的类型
weak_ordering::less 第一个操作数小于第二个操作数
weak_ordering::greater 第一个操作数大于第二个操作数
weak_ordering::equivalent第一个操作数等于第二个操作数
class ClassA
{
public:
ClassA() {
data = 0;
};
weak_ordering operator<=>(const ClassA& classA) {
if (this->data < classA.data) {
return weak_ordering::less;
}
if (this->data > classA.data) {
return weak_ordering::greater;
}
if (this->data = classA.data) {
return weak_ordering::equivalent;
}
}
public:
int data;
};
int main()
{
ClassA a;
a.data = 3;
ClassA b;
b.data = 2;
auto result = a <=> b;
if (result == weak_ordering::less) { cout << "less" << endl; }
if (result == weak_ordering::greater) { cout << "greater" << endl; }
if (result == weak_ordering::equivalent) { cout << "equal" << endl; }
}
总结
对于原始类型,与仅使用==、<和>运算符进行单个比较相比,使用三向比较运算符不会带来太多收益。但是,它对于比较昂贵的对象很有用。
提供命名的比较函数来解释排序结果,这些函数是std::is_eq()、is_neq()、is_lt()、is_gt()以及is_gteq()。函数返回类型为布尔。
int i {11};
strong_ordering result { i <=> 0};
if(is_lt(result)){ cout << "less" << endl; }