聊聊C++20的三向比较运算符 `<=>`
C++20标准引入了许多新特性,其中之一是三向比较运算符 <=>,也被称为太空船运算符。这个新运算符为C++程序员提供了一种全新的比较对象的方式,它能有效简化比较逻辑,避免编写多个比较运算符重载的情况。
为什么需要三向比较运算符?
在C++20之前,如果要完整地定义一个类型的比较行为,你需要重载四个运算符:==、!=、< 和 >,有时还包括 <= 和 >=。这不仅使得代码冗长,而且增加了出错的可能性,因为需要确保所有这些运算符之间的逻辑一致性是一件不容易的事情。
三向比较运算符引入后,开发者就可以用单一的运算符表达相同的意图。这提高了代码的简洁性和可读性,并有助于减少错误。
三向比较运算符的工作原理
三向比较运算符通过比较两个对象,返回一个表示它们比较结果的值。这个值可以告诉我们两个对象是否相等、一个是否小于另一个,或者一个是否大于另一个。
在C++20中,这个运算符返回的不是简单的整数,而是std::strong_ordering、std::weak_ordering或std::partial_ordering中的一个值,这些都是定义在<compare>头文件中的新类型。
认识新的比较类别
运算符<=>返回的比较类别提供了不同级别的比较保证:
在C++20中引入了三向比较运算符<=>,也称为太空船运算符,它允许在单个操作中进行全面的比较。与这个运算符一起引入的还有几种新的比较类别,分别是std::strong_ordering、std::weak_ordering和std::partial_ordering。这些类别定义了比较的结果类型,并提供了不同的比较保证。
std::strong_ordering
std::strong_ordering是指两个值之间存在强序关系,即可以明确地比较它们的大小。它提供了最强的比较保证,即总是可以确定两个值是相等的、第一个值小于第二个值,还是第一个值大于第二个值。
使用std::strong_ordering的情况下,比较操作符(<=>)将返回std::strong_ordering::equal、std::strong_ordering::less或std::strong_ordering::greater中的一个,分别代表相等、小于和大于。这允许我们对比较结果进行清晰的布尔测试。
例如,基本数据类型(如整型和浮点型)之间的比较通常使用std::strong_ordering。
std::weak_ordering
std::weak_ordering提供了较弱的比较保证,它通常用于那些可以比较等价性,但不能总是完全确定排序关系的场合。例如,在某些情况下,两个不同的对象可能被视为等价的,尽管它们并不完全相等。
std::weak_ordering返回std::weak_ordering::equivalent、std::weak_ordering::less或std::weak_ordering::greater中的一个。std::weak_ordering::equivalent表示两个值在某种意义上是等价的,不一定意味着它们是相等的,但在排序中可以被视为等价。
例如,当比较忽略大小写的字符串时,两个字符串可能具有weak_ordering,因为在不考虑大小写的情况下,它们可以被视为等价的。
std::partial_ordering
std::partial_ordering是最弱的比较保证,它用于那些可能没有完整排序关系的场合。在这种比较中,一些值可能无法相互比较,比如浮点数中的NaN(Not a Number)值。
std::partial_ordering返回std::partial_ordering::less、std::partial_ordering::equivalent、std::partial_ordering::greater或std::partial_ordering::unordered中的一个。std::partial_ordering::unordered表示两个值之间没有可定义的顺序。
例如,浮点数比较可能返回partial_ordering,因为如果任意一个操作数是NaN,那么比较结果就是无序的。
这三种比较类别允许C++程序员更准确地指定他们的类或结构体比较操作的语义和行为。通过在operator<=>的实现中返回适当的比较类别,我们可以为使用我们类型的代码提供清晰的比较语义,增加了代码的可读性和健壮性。这些新特性是C++20标准提供的类型系统增强的一部分,让C++程序更加安全、清晰且易于维护。
使用三向比较运算符
在自己的类中使用三向比较运算符很简单。你可以通过在类内声明一个返回三向比较结果的operator<=>来实现。例如:
#include <compare>class MyValue {
public:int value;auto operator<=>(const MyValue&) const = default;
};
在这个例子中,MyValue类默认地定义了三向比较运算符。现在,我们可以使用<=>来比较MyValue的实例,并使用结果进行进一步的比较:
MyValue a{5}, b{10};
auto result = a <=> b;
if (result < 0) {// a 小于 b
} else if (result > 0) {// a 大于 b
} else {// a 等于 b
}
结语
与模块(Modules)、协程(Coroutines)、概念(Concepts)等特性相比,三相比较运算符似乎微不足道,但从这一个小小的三相比较运算符的引入,我们可以看到C++的复杂之处与细心之处,因为周边的配套类型(std::strong_ordering、std::weak_ordering和std::partial_ordering)为比较语言提供了严格复杂的抽象,有助于编写出更清晰、更健壮的代码。通过三相比较运算符,我们也能一窥现代C++的发展趋势,提供了一种更为高效和直观的比较方法,也在语言层面上极大地简化了开发者的工作。
相关文章:
聊聊C++20的三向比较运算符 `<=>`
C20标准引入了许多新特性,其中之一是三向比较运算符 <>,也被称为太空船运算符。这个新运算符为C程序员提供了一种全新的比较对象的方式,它能有效简化比较逻辑,避免编写多个比较运算符重载的情况。 为什么需要三向比较运算符…...
CVE-2024-0603 漏洞复现
CVE-2024-0603 源码:https://gitee.com/dazensun/zhicms 开题: CVE-2024-0603描述:ZhiCms up to 4.0版本的文件app/plug/controller/giftcontroller.php中存在一处未知漏洞。攻击者可以通过篡改参数mylike触发反序列化,从而远程…...
西部智慧健身小程序+华为运动健康服务
1、 应用介绍 西部智慧健身小程序为用户提供一站式全流程科学健身综合服务。用户通过登录微信小程序,可享用健康筛查、运动风险评估、体质检测评估、运动处方推送、个人运动数据监控与评估等公益服务。 2、 体验介绍西部智慧健身小程序华为运动健康服务核心体验如…...
Spring Boot中如何处理异步任务
Spring Boot中如何处理异步任务 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们将探讨在Spring Boot应用中如何处理异步任务,以提升系统的性…...
数字化精益生产系统--RD研发管理系统
R&D研发管理系统是一种用于管理和监督科学研究和技术开发的软件系统,其设计和应用旨在提高企业研发活动的效率、质量和速度。以下是对R&D研发管理系统的功能设计:...
鱼眼相机 去畸变
目录 枕形畸变和去枕形畸变 去枕形畸变失败 枕形畸变和去枕形畸变 import cv2 import numpy as np import matplotlib.pyplot as plt# 创建一个带网格的原始图像 def create_grid(image_size512, grid_size20):image np.zeros((image_size, image_size, 3), dtypenp.uint8)…...
DC/AC电源模块:为智能家居设备提供恒定的电力供应
BOSHIDA DC/AC电源模块:为智能家居设备提供恒定的电力供应 DC/AC电源模块是一种常见的电源转换器,它将直流电源(DC)转换为交流电源(AC),为智能家居设备提供恒定的电力供应。在智能家居系统中&a…...
小红书运营教程02
小红书大致会分享10篇左右。微博、抖音、以及视频剪辑等自媒体运营相关技能以及运营教程相关会陆续的进行分享。 上次分享涉及到的对比,母婴系列,或者可以说是服装类型,不需要自己过多的投入,对比知识类博主来说,自己将知识讲述出来,然后要以此账号进行变现就比较麻烦,…...
k8s自动清理节点服务
要在 Kubernetes 中实现当某个节点的 CPU 或内存使用超过 90% 时清理该节点上的服务,你可以使用以下几种方法: 自定义脚本和 cron job:编写一个脚本监控节点的资源使用情况,并在超过阈值时触发清理操作。使用 DaemonSet 运行监控…...
JS如何把年月日转为时间戳
在JavaScript中,将年月日(通常表示为一个字符串或者分别的年、月、日数字)转换为时间戳(即Unix时间戳,是自1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒)可以…...
【YOLOv5进阶】——引入注意力机制-以SE为例
声明:笔记是做项目时根据B站博主视频学习时自己编写,请勿随意转载! 一、站在巨人的肩膀上 SE模块即Squeeze-and-Excitation 模块,这是一种常用于卷积神经网络中的注意力机制!! 借鉴代码的代码链接如下&a…...
【C++题解】1456. 淘淘捡西瓜
问题:1456. 淘淘捡西瓜 类型:贪心 题目描述: 地上有一排西瓜,每个西瓜都有自己的重量。淘淘有一个包,包的容量是固定的,淘淘希望尽可能在包里装更多的西瓜(当然要装整个的,不能切开…...
用Python读取Word文件并提取标题
前言 在日常工作中,我们经常需要处理Word文档,特别是从中提取关键信息,如标题、段落等。今天,我们将利用Python来实现这一功能,并为大家提供一段完整的代码示例。 准备工作 首先,你需要安装python-docx库…...
Windows编程上
Windows编程[上] 一、Windows API1.控制台大小设置1.1 GetStdHandle1.2 SetConsoleWindowInfo1.3 SetConsoleScreenBufferSize1.4 SetConsoleTitle1.5 封装为Innks 2.控制台字体设置以及光标调整2.1 GetConsoleCursorInfo2.2 SetConsoleCursorPosition2.3 GetCurrentConsoleFon…...
BiTCN-Attention一键实现回归预测+8张图+特征可视化图!注意力全家桶再更新!
声明:文章是从本人公众号中复制而来,因此,想最新最快了解各类智能优化算法及其改进的朋友,可关注我的公众号:强盛机器学习,不定期会有很多免费代码分享~ 目录 原理简介 数据介绍 结果展示 全家桶代码目…...
zoom缩放问题(关于ElementPlus、Echarts、Vue3draggable等组件偏移问题)
做了一个项目下来,由于整体界面偏大,采取了缩放90%,导致很多组件出现偏移问题,以下我会把我遇到的各种组件偏移问题依次进行描述解答: ElementPlus选择器下拉偏移 <template><el-select :teleported"f…...
【后端面试题】【中间件】【NoSQL】MongoDB的配置服务器、复制机制、写入语义和面试准备
MongoDB的配置服务器 引入了分片机制之后,MongoDB启用了配置服务器(config server) 来存储元数据,这些元数据包括分片信息、权限控制信息,用来控制分布式锁。其中分片信息还会被负责执行查询mongos使用。 MongoDB的配置服务器有一个很大的优…...
视频监控汇聚平台LntonCVS视频监控业务平台具体有哪些功能?
LntonCVS视频监控平台是一款基于H5技术开发的专业安防视频监控产品,旨在为安防视频监控行业提供全面的解决方案。以下是平台的主要功能和特点: 1. 统一接入管理: - 支持国内外各种品牌、协议和设备类型的监控产品统一接入管理。 - 提供标准的…...
我不小心把生产的数据改错了!同事帮我用MySQL的BinLog挽回了罚款
之前在生产做修改数据的时候不小心改错了一行数据,本来以为会被通报批评,但是同事利用binlog日志查看到了之前的旧数据,并且帮我回滚了,学到了,所以写了一篇binlog的文章分享给大家。 MySQL的Binary Log(简…...
Windows系统安装NVM,实现Node.js多版本管理
目录 一、前言 二、NVM简介 三、准备工作 1、卸载Node 2、创建文件夹 四、下载NVM 五、安装NVM 六、使用NVM 1、NVM常用操作命令 2、查看NVM版本信息 3、查看Node.js版本列表; 4、下载指定版本Node.js 5、使用指定版本Node.js 6、查看已安装Node.js列…...
【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...
新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...
学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...
论文笔记——相干体技术在裂缝预测中的应用研究
目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...
[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】,分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...
JavaScript 数据类型详解
JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型(Primitive) 和 对象类型(Object) 两大类,共 8 种(ES11): 一、原始类型(7种) 1. undefined 定…...
PostgreSQL——环境搭建
一、Linux # 安装 PostgreSQL 15 仓库 sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm# 安装之前先确认是否已经存在PostgreSQL rpm -qa | grep postgres# 如果存在࿰…...
