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
相关推荐
王老师青少年编程15 小时前
csp信奥赛C++高频考点专项训练之贪心算法 --【哈夫曼贪心】:合并果子
c++·算法·贪心·csp·信奥赛·哈夫曼贪心·合并果子
叼烟扛炮15 小时前
C++第二讲:类和对象(上)
数据结构·c++·算法·类和对象·struct·实例化
样例过了就是过了17 小时前
LeetCode热题100 最长公共子序列
c++·算法·leetcode·动态规划
谭欣辰17 小时前
C++ 排列组合完整指南
开发语言·c++·算法
橙子也要努力变强18 小时前
信号捕捉底层机制-机理篇2
linux·服务器·c++
盐焗鹌鹑蛋18 小时前
【C++】stack和queue类
c++
郝学胜-神的一滴19 小时前
罗德里格斯旋转公式(Rodrigues‘ Rotation Formula)完整推导
c++·unity·godot·图形渲染·three.js·unreal
lzh2004091919 小时前
深入理解进程:从PCB内核结构到写时拷贝的底层实战
linux·c++
aseity19 小时前
跨平台项目中QString 与 非Qt 跨平台动态库在字符集上的一个实用的互操作约定.
c++·经验分享
CN-Dust20 小时前
【C++】while语句例题专题
数据结构·c++·算法