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

2024-05-15 08:52

本文主要是介绍【现代C++】三路比较运算符,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述

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++中被用于简化比较逻辑,使得代码更加简洁且易于理解。

这篇关于【现代C++】三路比较运算符的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/991374

相关文章

MySQL中比较运算符的具体使用

《MySQL中比较运算符的具体使用》本文介绍了SQL中常用的符号类型和非符号类型运算符,符号类型运算符包括等于(=)、安全等于(=)、不等于(/!=)、大小比较(,=,,=)等,感兴趣的可以了解一下... 目录符号类型运算符1. 等于运算符=2. 安全等于运算符<=>3. 不等于运算符<>或!=4. 小于运

C++中全局变量和局部变量的区别

《C++中全局变量和局部变量的区别》本文主要介绍了C++中全局变量和局部变量的区别,全局变量和局部变量在作用域和生命周期上有显著的区别,下面就来介绍一下,感兴趣的可以了解一下... 目录一、全局变量定义生命周期存储位置代码示例输出二、局部变量定义生命周期存储位置代码示例输出三、全局变量和局部变量的区别作用域

C++中assign函数的使用

《C++中assign函数的使用》在C++标准模板库中,std::list等容器都提供了assign成员函数,它比操作符更灵活,支持多种初始化方式,下面就来介绍一下assign的用法,具有一定的参考价... 目录​1.assign的基本功能​​语法​2. 具体用法示例​​​(1) 填充n个相同值​​(2)

c++ 类成员变量默认初始值的实现

《c++类成员变量默认初始值的实现》本文主要介绍了c++类成员变量默认初始值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录C++类成员变量初始化c++类的变量的初始化在C++中,如果使用类成员变量时未给定其初始值,那么它将被

C++中NULL与nullptr的区别小结

《C++中NULL与nullptr的区别小结》本文介绍了C++编程中NULL与nullptr的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编... 目录C++98空值——NULLC++11空值——nullptr区别对比示例 C++98空值——NUL

C++ Log4cpp跨平台日志库的使用小结

《C++Log4cpp跨平台日志库的使用小结》Log4cpp是c++类库,本文详细介绍了C++日志库log4cpp的使用方法,及设置日志输出格式和优先级,具有一定的参考价值,感兴趣的可以了解一下... 目录一、介绍1. log4cpp的日志方式2.设置日志输出的格式3. 设置日志的输出优先级二、Window

C# 比较两个list 之间元素差异的常用方法

《C#比较两个list之间元素差异的常用方法》:本文主要介绍C#比较两个list之间元素差异,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. 使用Except方法2. 使用Except的逆操作3. 使用LINQ的Join,GroupJoin

从入门到精通C++11 <chrono> 库特性

《从入门到精通C++11<chrono>库特性》chrono库是C++11中一个非常强大和实用的库,它为时间处理提供了丰富的功能和类型安全的接口,通过本文的介绍,我们了解了chrono库的基本概念... 目录一、引言1.1 为什么需要<chrono>库1.2<chrono>库的基本概念二、时间段(Durat

C++20管道运算符的实现示例

《C++20管道运算符的实现示例》本文简要介绍C++20管道运算符的使用与实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录标准库的管道运算符使用自己实现类似的管道运算符我们不打算介绍太多,因为它实际属于c++20最为重要的

Visual Studio 2022 编译C++20代码的图文步骤

《VisualStudio2022编译C++20代码的图文步骤》在VisualStudio中启用C++20import功能,需设置语言标准为ISOC++20,开启扫描源查找模块依赖及实验性标... 默认创建Visual Studio桌面控制台项目代码包含C++20的import方法。右键项目的属性: