当前位置: 首页 > news >正文

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左边的操作数等于右边的操作数

三向比较运算符的用法

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

#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()

使用的方式如下:

#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 中,重载了 == 后,!= 也会自动重载)

以下是使用示例:

#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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 你的网站访客来自何方?GoAccess地理分析工具告诉你!
  • 图像生成中图像质量评估指标—FID介绍
  • C#的#define #if用法
  • 《C语言程序设计 第4版》笔记和代码 第十三章 文件操作
  • 二百五十四、OceanBase——Linux上安装OceanBase数据库(四):登录ocp-express,配置租户管理等信息
  • Swift-Extension
  • 【简单讲解下Symfony框架】
  • 给python初学者的一些建议
  • 线程创建的4种方式
  • 笔记小结:《利用Python进行数据分析》之读取数据
  • CC++:贪吃蛇小游戏教程
  • salesforce 在不修改目标对象的情况下,生成超过报告生成能力的报告
  • Google引领LLM竞赛:Gemini 1.5 Pro的创新与突破
  • niushop逻辑漏洞
  • 实现数组扁平化的几种方式
  • 【跃迁之路】【641天】程序员高效学习方法论探索系列(实验阶段398-2018.11.14)...
  • Asm.js的简单介绍
  • Github访问慢解决办法
  • Js基础——数据类型之Null和Undefined
  • MaxCompute访问TableStore(OTS) 数据
  • Node.js 新计划:使用 V8 snapshot 将启动速度提升 8 倍
  • Terraform入门 - 1. 安装Terraform
  • vue2.0项目引入element-ui
  • win10下安装mysql5.7
  • 第2章 网络文档
  • 什么软件可以剪辑音乐?
  • 问:在指定的JSON数据中(最外层是数组)根据指定条件拿到匹配到的结果
  • #如何使用 Qt 5.6 在 Android 上启用 NFC
  • (2)MFC+openGL单文档框架glFrame
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (附源码)ssm本科教学合格评估管理系统 毕业设计 180916
  • (回溯) LeetCode 77. 组合
  • (原創) 如何將struct塞進vector? (C/C++) (STL)
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • **python多态
  • *_zh_CN.properties 国际化资源文件 struts 防乱码等
  • .Net Core webapi RestFul 统一接口数据返回格式
  • .NET Core 控制台程序读 appsettings.json 、注依赖、配日志、设 IOptions
  • .net和jar包windows服务部署
  • .NET是什么
  • :not(:first-child)和:not(:last-child)的用法
  • @DateTimeFormat 和 @JsonFormat 注解详解
  • @Validated和@Valid校验参数区别
  • [ActionScript][AS3]小小笔记
  • [Angular] 笔记 18:Angular Router
  • [C++]priority_queue的介绍及模拟实现
  • [codevs 1515]跳 【解题报告】
  • [CVPR2021]Birds of a Feather: Capturing Avian Shape Models from Images
  • [HJ73 计算日期到天数转换]
  • [HOW TO]如何在iPhone应用程序中发送邮件
  • [javaSE] GUI(事件监听机制)
  • [Java基础] Java中List.remove报错UnsupportedOperationException
  • [JS]变量
  • [Linux]----文件操作(复习C语言+文件描述符)
  • [one_demo_2]使用正则表达式过滤字符串