【现代C++】三路比较运算符

news2024/11/16 21:36:05

在这里插入图片描述

C++20引入了三路比较运算符(也称为太空船运算符,<=>),它允许同时比较两个值,并返回它们的相对顺序。这个运算符简化了需要定义多个比较运算符(如==!=<<=>>=)的类的代码,提高了代码的简洁性和可读性。以下是三路比较运算符的详细介绍和示例代码:

1. 基本用法

三路比较运算符返回一个std::strong_orderingstd::weak_orderingstd::partial_ordering类型的值,表示小于、等于或大于。

#include <compare>
#include <iostream>

void basicUsage() {
    int a = 5, b = 10;
    auto result = a <=> b;

    if (result < 0) {
        std::cout << "a < b" << std::endl;
    } else if (result == 0) {
        std::cout << "a == b" << std::endl;
    } else {
        std::cout << "a > b" << std::endl;
    }
}

2. 在类中使用

你可以在自定义类型中重载三路比较运算符来提供全面的比较功能。

#include <compare>
#include <iostream>

class Point {
public:
    int x, y;

    auto operator<=>(const Point&) const = default;  // 默认比较生成
};

void classUsage() {
    Point p1{1, 2}, p2{1, 3};

    if (p1 <=> p2 == 0) {
        std::cout << "p1 == p2" << std::endl;
    } else {
        std::cout << "p1 != p2" << std::endl;
    }
}

3. 自定义比较逻辑

当默认生成的比较逻辑不符合需求时,你可以为三路比较运算符提供自定义实现。

#include <compare>
#include <iostream>

class Distance {
public:
    int meters;

    std::strong_ordering operator<=>(const Distance& other) const {
        return meters <=> other.meters;
    }
};

void customComparison() {
    Distance d1{100}, d2{200};

    if (d1 <=> d2 < 0) {
        std::cout << "d1 < d2" << std::endl;
    } else if (d1 <=> d2 == 0) {
        std::cout << "d1 == d2" << std::endl;
    } else {
        std::cout << "d1 > d2" << std::endl;
    }
}

4. 使用结果进行链式比较

三路比较运算符的结果可以用于链式比较,提高代码的可读性和编写效率。

#include <compare>
#include <iostream>

void chainComparison() {
    int a = 5, b = 5, c = 10;
    
    if (auto result = a <=> b; result == 0) {
        std::cout << "a == b, ";
        std::cout << "and they are " << ((a <=> c) < 0 ? "less" : "greater") << " than c" << std::endl;
    }
}

通过上述示例可以看到三路比较运算符如何在现代C++中被用于简化比较逻辑,使得代码更加简洁且易于理解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1677196.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何在 Windows 11/10 中恢复已删除的分区

在将重要数据存储在计算机上之前&#xff0c;许多用户会创建分区以更好地组织和管理他们的文件。此分区可以在内部硬盘驱动器或外部存储设备上创建。但是&#xff0c;有时可能会意外删除分区。如果发生这种情况&#xff0c;您可能想知道是否可以在不丢失任何信息的情况下恢复已…

elasticsearch(下载安装、基本操作、查询、聚合、SpringData-Elasticsearch)

文章目录 1. 了解搜索技术1.1. 什么是搜索1.2. 新业务需求1.3. 搜索引擎1.4. 倒排索引(Inverted index)1.5. 认识lucene1.6. 什么是全文检索 2.下载安装2.1. elastic2.2 下载2.2.1 elasticsearch2.2.2 kibana地址2.2.3 ik中文分词器地址 2.3 安装elasticsearch2.3.1 安装elasti…

移动端自动化测试工具 Appium 之持续集成

文章目录 一、背景二、前置条件三、代码部分1、pom.xml文件配置2、main入口代码 四、Jenkins 部分1、下载Jenkins2、安装插件3、job配置4、选择构建 五、工程目录六、报告示例七、总结 一、背景 持续集成是老生话谈的事情&#xff0c;用的好不好&#xff0c;看自己公司与使用场…

【3dmax笔记】022:文件合并、导入、导出

文章目录 一、合并二、导入三、导出四、注意事项一、合并 只能合并 max 文件(高版本能够合并低版本模型,低版本不能合并高版本的模型)。点击【文件】→【导入】→【合并】: 选择要合并的文件,后缀名为3dmax默认的格式,max文件。 二、导入 点击【文件】→【导入】→【导…

Python轻量级Web框架Flask(14)—— 自己做Flask项目总结

0、前言&#xff1a; 本文意在记录自己在做毕业Flask项目开发时遇到的一些问题&#xff0c;并将问题解决方案记录下来&#xff0c;可做日后查询本文也会记录自己做FLask项目时实现的一些功能&#xff0c;作为开发工作的进程记录注意&#xff1a;用Flask开发的前提是已经设计好…

202009青少年软件编程(Python)等级考试试卷(三级)

第 1 题 【单选题】 通过算式123122021120可将二进制1101 转为十进制,下列进制转换结果正确的是?( ) A :0b10转为十进制,结果是2 B :0d10转为十进制,结果是8 C :0x10转为十进制,结果是10 D :0o10转为十进制,结果是16 正确答案:A 试题解析: 第 2 题 【单选题】 语句flo…

svn如何远程访问?

svn&#xff08;Subversion&#xff09;是一种版本控制系统&#xff0c;广泛应用于软件开发领域。它能够追踪文件和目录的变化&#xff0c;记录每个版本的修改内容&#xff0c;并允许多人协同开发。svn的远程访问功能允许开发人员可以在不同的地点访问和管理代码&#xff0c;提…

ES6之正则扩展

正则表达式扩展 u修饰符&#xff08;Unicode模式&#xff09;y修饰符&#xff08;Sticky或粘连模式&#xff09;s修饰符&#xff08;dotAll模式&#xff09;Unicode属性转义正则实例的flags属性字符串方法与正则表达式的整合 javascript的常用的正则表达式 验证数字邮箱验证手机…

华为OD机试 - CPU算力分配(Java 2024 C卷 100分)

华为OD机试 2024C卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷C卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;每一题都有详细的答题思路、详细的代码注释、样例测试…

string的模拟全实现

文章目录 &#x1f4dd;前言&#x1f320; string的基本要素&#x1f309;构造函数和析构函数&#x1f320;string()&#x1f309;string(const char* str ""); &#x1f320;~string()&#x1f309;深拷贝string(const string& s); &#x1f320;三个成员函数的…

外网ip地址怎么获取?快解析

大家都清楚互联网是通过ip地址通信的&#xff0c;ip地址又分内网ip和外网ip。内网ip只能在内网使用&#xff1b;而外网ip作为电脑唯一标识&#xff0c;可在公网使用。那么外网ip地址怎么获取呢&#xff1f; 外网ip是网络运营商分配给用户的。目前最常见的两种上网方式一个是拉…

金航标kinghelm萨科微slkor公司发展和品牌传播

为了金航标kinghelm萨科微slkor公司发展和品牌传播&#xff0c;推出了”金航标每日芯闻“与“萨科微每日芯闻“栏目&#xff0c;影响力非常好。这一构想并非一时的灵光乍现&#xff0c;而是经过深思熟虑和充分调研的结果。制定该栏目的模板时候时&#xff0c;就明确了要求语音版…

【nfs服务部署服务端和客户端搭建】

原理 NFS&#xff08;Network File System&#xff09;是文件服务器之一。它的功能是可以通过网络&#xff0c;让不同的机器、不同的操作系统可以彼此共享数据文件。 NFS服务器可以让服务端的共享目录挂载到本地端的文件系统中&#xff0c;其他服务器如果想访问共享目录&#…

windows 安装 Conda

1 Conda简介 Conda 是一个开源的软件包管理系统和环境管理系统&#xff0c;用于安装多个版本的软件包及其依赖关系&#xff0c;并在它们之间轻松切换。Conda 是为 Python 程序创建的&#xff0c;适用于 Linux&#xff0c;OS X 和Windows&#xff0c;也可以打包和分发其他软…

键盘和鼠标的隐形观察者:用Python的pynput库记录每一个动作

哈喽&#xff0c;大家好&#xff0c;我是木头左&#xff01; 揭秘pynput&#xff1a;监控神器还是隐私威胁&#xff1f; 在数字时代&#xff0c;的每一次键盘敲击和鼠标点击都可能泄露信息。但如果能够控制这一过程&#xff0c;又将如何利用这些数据呢&#xff1f;Python的pyn…

“Linux”目录结构and配置网络

了解完命令格式和vi、vim编辑器后&#xff0c;我们来认识一下目录的结构&#xff1a; 一、目录 &#xff08;1&#xff09;目录的特点 windows特点&#xff1a; Windows中有C、D、E盘&#xff0c;每个都是一个根系统 Linux特点&#xff1a; linux中只有一个根&#xff08;单…

【opencv】opencv透视变换和ocr识别实验

实验环境&#xff1a;anaconda、jupyter notebook 实验用到的包opencv、numpy、matplotlib、tesseract 一、opencv透视变换 原图 图片是我拍的耳机说明书&#xff0c;哈哈哈哈&#xff0c;你也可以使用自己拍的照片&#xff0c;最好是英文内容&#xff0c;tesseract默认识别英…

C++|多态性与虚函数(2)|虚析构函数|重载函数|纯虚函数|抽象类

前言 看这篇之前&#xff0c;可以先看多态性与虚函数&#xff08;1&#xff09;⬇️ C|多态性与虚函数&#xff08;1&#xff09;功能绑定|向上转换类型|虚函数-CSDN博客https://blog.csdn.net/weixin_74197067/article/details/138861418?spm1001.2014.3001.5501这篇文章会…

Kasawaki川崎机器人故障维修

在当今的自动化工业领域&#xff0c;川崎工业机器人以其卓越的性能和可靠的工作效率赢得了广泛的赞誉。作为机器人的核心组成部分&#xff0c;伺服电机的作用至关重要。然而&#xff0c;就像所有机械设备一样&#xff0c;也可能会遭遇电机磨损或故障&#xff0c;需要适时的川崎…