C++20三向比较运算符详解

三向比较运算符可以用于确定两个值的大小顺序,也被称为太空飞船操作符。使用单个表达式,它可以告诉一个值是否等于,小于或大于另一个值。

它返回的是类枚举(enumeration-like)类型,定义在 <compare>std 名称空间中。其运算的结果如下:

数据类型 含义
如果操作数为整数类型,其结果称为 强排序(strong_ordering) strong_ordering::less 左边的操作数小于右边的操作数
strong_ordering::greater 左边的操作数大于右边的操作数
strong_ordering::equal 左边的操作数等于右边的操作数
如果操作数为浮点类型,其结果称为 偏序(partial_ordering) partial_ordering::less 左边的操作数小于右边的操作数
partial_ordering::greater 左边的操作数大于右边的操作数
partial_ordering::equivalent 左边的操作数等于右边的操作数
partial_ordering::unordered 无法比较时(有一个非数字)
如果操作数为自己实现的类型,称为 弱排序(weak_ordering) weak_ordering::less 左边的操作数小于右边的操作数
weak_ordering::greater 左边的操作数大于右边的操作数
weak_ordering::equivalent 左边的操作数等于右边的操作数

三向比较运算符的用法

三向比较运算符的使用方式如下:

cpp 复制代码
#include <iostream>

using namespace std;

int main() {
    int i{ 11 };
    strong_ordering result{ i <=> 0 };
    cout << typeid(result).name() << endl;

    if (result == strong_ordering::less) { cout << "less" << endl; };
    if (result == strong_ordering::greater) { cout << "greater" << endl; };
    if (result == strong_ordering::equal) { cout << "equal" << endl; };

    return 0;
}

可以得到以下的输出结果

复制代码
struct std::strong_ordering
greater

同时,<compare> 还提供了一些函数来解释排序结果,有以下几种:std::is_eq()is_neq()is_lt()is_lteq()is_gt()is_gteq()

使用的方式如下:

cpp 复制代码
#include <iostream>
#include <compare>
using namespace std;

int main() {
    int i{ 11 };
    strong_ordering result{ i <=> 0 };
    cout << typeid(result).name() << endl;

    if (is_lt(result)) { cout << "less" << endl; };
    if (is_gt(result)) { cout << "greater" << endl; };
    if (is_eq(result)) { cout << "equal" << endl; };

    return 0;
}

三向比较运算符的作用

在编写自己的类时,如果需要实现比较运算符,在 C++20 之前,通常要重载 6 个比较运算符:(><<=>===, !=)。在 C++20 引入了三向比较运算符以后,就可以只重载 <=>== 后,其他的运算符会由编译器为我们生成。(在 C++20 中,重载了 == 后,!= 也会自动重载)

以下是使用示例:

cpp 复制代码
#include <iostream>
#include <compare>
using namespace std;

class MyClass {
public:
    MyClass(int ini) : _data{ ini } {}

    auto operator<=>(const MyClass& other) const {
        return this->_data <=> other._data;
    }
    auto operator==(const MyClass& other) const {
        return this->_data == other._data;
    }
private:
    int _data;
};

int main() {
    MyClass a{ 10 }, b{ 20 };

    if (a < b) {
        cout << "a < b" << endl;
    }
    if (a != b) {
        cout << "a != b" << endl;
    }

    return 0;
}

可以得到以下的运算结果:

复制代码
a < b
a != b
相关推荐
菜鸟破茧计划24 分钟前
C++ 算法学习之旅:从入门到精通的秘籍
c++·学习·算法
喜欢吃燃面36 分钟前
C++:扫雷游戏
c语言·c++·学习
海木漄1 小时前
关于点胶机的精度
c++·点胶机
yunbao00_1 小时前
C++ 复习(一)
开发语言·c++
vvilkim1 小时前
C++并发编程完全指南:从基础到实践
c++
feiyangqingyun1 小时前
Qt/C++开发监控GB28181系统/警情订阅/目录订阅/报警事件上报/通道上下线
c++·qt·gb28181
江海余生2 小时前
C++11——右值引用&完美转发
c++·c++11
石去皿2 小时前
C++ 中的 `it->second` 和 `it.second`:迭代器与对象访问的微妙区别
开发语言·c++·算法·leetcode
菜狗想要变强2 小时前
C++ STL 入门:map 键值对容器
c++
繁星蓝雨3 小时前
Qt中数据结构使用自定义类————附带详细示例
数据结构·c++·qt·qmap·qset