C++20中头文件compare的使用

news2024/12/24 9:19:32

      <compare>是C++20中新增加的头文件,此头文件是language support库的一部分。它包括:concepts、classes、customization point objects、functions。

      1.concepts:三向比较运算符<=>,目的是简化比对对象的过程,支持所有六种关系运算符(==、!=、>、>=、<、<=),返回表示比较结果的枚举值,这个枚举值可以被用来决定两个对象是否相等、小于或大于另一个对象,详细介绍参考:https://blog.csdn.net/fengbingchun/article/details/140078283  ,测试代码如下:所有std::cout都会输出

namespace {
auto compare = []<typename T>(const T & x, const T & y) {
	return x <=> y;
};

struct Point {
	int x, y;
	
	auto operator<=>(const Point& other) const = default;
};

const std::string str1{ "abc" }, str2{ "Abc" }, str3{ "abc" };

template<class Ord>
void print_cmp_type()
{
	if constexpr (std::is_same_v<Ord, std::strong_ordering>)
		std::cout << "strong ordering\n";
	else if constexpr (std::is_same_v<Ord, std::weak_ordering>)
		std::cout << "weak ordering\n";
	else if constexpr (std::is_same_v<Ord, std::partial_ordering>)
		std::cout << "partial ordering\n";
	else
		std::cout << "illegal comparison result type\n";
}

} // namespace

int test_compare_concepts()
{
	constexpr auto x{ 1 }, y{ 2 }, z{ 1 };
	if (compare(x, y) < 0) std::cout << x << " < " << y << std::endl;
	if (compare(y, x) > 0) std::cout << y << " > " << x << std::endl;
	if (compare(x, z) == 0) std::cout << x << " == " << z << std::endl;

	if (compare(str2, str1) < 0) std::cout << str2 << " < " << str1 << std::endl;
	if (compare(str1, str2) > 0) std::cout << str1 << " > " << str2 << std::endl;
	if (compare(str1, str3) == 0) std::cout << str1 << " == " << str3 << std::endl;

	return 0;
}

      2.classes:

      三向比较的结果类型:枚举值,支持所有六种关系运算符(==, !=, <, <=, >, >=)

      类std::strong_ordering:有4种有效值:less、equal、equivalent、greater。

      类std::weak_ordering:有3种有效值:less、equivalent、greater。

      类std::partial_ordering:有4种有效值:less、equivalent、greater、unordered。

      std::compare_three_way:执行三向比较,一般不直接调用。

      std::compare_three_way_result:三向比较运算符的结果类型。

int test_compare_classes()
{
	if (compare(str2, str1) == std::strong_ordering::less) std::cout << str2 << " < " << str1 << std::endl;
	if (compare(str1, str2) == std::strong_ordering::greater) std::cout << str1 << " > " << str2 << std::endl;
	if (compare(str1, str3) == std::strong_ordering::equal) std::cout << str1 << " == " << str3 << std::endl;

	constexpr float x{ 1.f }, y{ 2.f }, z{ 1.f };
	if (compare(x, y) == std::weak_ordering::less) std::cout << x << " < " << y << std::endl;
	if (compare(y, x) == std::weak_ordering::greater) std::cout << y << " > " << x << std::endl;
	if (compare(x, z) == std::weak_ordering::equivalent) std::cout << x << " == " << z << std::endl;

	constexpr Point p1{ 1,2 }, p2{ 2,3 };
	auto ret = p1 <=> p2;
	if (ret == std::partial_ordering::less) std::cout << "p1 < p2" << std::endl;
	if (std::compare_three_way{}(p1, p2) == std::strong_ordering::less) std::cout << "p1 < p2" << std::endl;

	print_cmp_type<std::compare_three_way_result_t<int>>(); // strong ordering
	print_cmp_type<std::compare_three_way_result_t<double>>(); // partial ordering

	return 0;
}

      执行结果如下图所示:

      3.customization point objects:

      std::strong_order:执行三向比较并生成std::strong_ordering类型的结果。

      std::weak_order:执行三向比较并生成std::weak_ordering类型的结果。

      std::partial_order:执行三向比较并生成std::partial_ordering类型的结果。

      std::compare_strong_order_fallback:执行三向比较并生成std::strong_ordering类型的结果,即使运算符<=>不可用

      std::compare_weak_order_fallback:执行三向比较并生成std::weak_ordering类型的结果,即使运算符<=>不可用。

      std::compare_partial_order_fallback:执行三向比较并生成std::partial_ordering类型的结果,即使运算符<=>不可用。

     测试代码如下,所有std::cout都会输出

int test_compare_customization_point_objects()
{
	if (std::strong_order(str1, str2) == std::strong_ordering::greater) std::cout << str1 << " > " << str2 << std::endl;
	if (std::weak_order(str2, str1) == std::weak_ordering::less) std::cout << str2 << " < " << str1 << std::endl;
	if (std::partial_order(str1, str3) == std::partial_ordering::equivalent) std::cout << str1 << " == " << str3 << std::endl;

	if (std::compare_strong_order_fallback(str1, str2) == std::strong_ordering::greater) std::cout << str1 << " > " << str2 << std::endl;
	if (std::compare_weak_order_fallback(str2, str1) == std::weak_ordering::less) std::cout << str2 << " < " << str1 << std::endl;
	if (std::compare_partial_order_fallback(str1, str3) == std::partial_ordering::equivalent) std::cout << str1 << " == " << str3 << std::endl;

	return 0;
}

      4.functions:std::is_eq、std::is_neq、std::is_lt、std::is_lteq、std::is_gt、std::is_gteq,比较函数,这些函数将三向比较的结果转换为六个关系运算符之一的结果,依次为==、!=、<、<=、>、>=。

      测试代码如下,所有std::cout都会输出

int test_compare_functions()
{
	if (std::is_eq(std::strong_order(str1, str3))) std::cout << str1 << " == " << str3 << std::endl;
	if (std::is_neq(std::strong_order(str1, str2))) std::cout << str1 << " != " << str2 << std::endl;

	if (std::is_lt(std::weak_order(str2, str1))) std::cout << str2 << " < " << str1 << std::endl;
	if (std::is_lteq(std::weak_order(str2, str1))) std::cout << str2 << " <= " << str1 << std::endl;

	if (std::is_gt(std::partial_order(str1, str2))) std::cout << str1 << " > " << str2 << std::endl;
	if (std::is_gteq(std::partial_order(str1, str3))) std::cout << str1 << " >= " << str3 << std::endl;

	return 0;
}

      GitHub:https://github.com/fengbingchun/Messy_Test

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

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

相关文章

ant design vue中带勾选表格报Tree missing follow keys: ‘undefined‘解决方法

1、这里一定要给columns和data-source设置key即可。 <div><a-table:row-selection"rowSelection":dataSource"tableList":columns"columns":scroll"{ x: 100% }":pagination"false":loading"loading"&g…

戴尔R750 H755N raid卡数据盘改直通模式

1、重启机器进入配置模式&#xff0c;重启后按F2进入bios模式

计算机网络(九) —— Tcp协议详解

目录 一&#xff0c;关于Tcp协议 二&#xff0c;Tcp报头字段解析 2.0 协议字段图示 2.1 两个老问题 2.2 16位窗口大小 2.3 32位序号和确认序号 2.4 6个标记位 三&#xff0c;Tcp保证可靠性策略 3.1 确认应答机制&#xff08;核心&#xff09; 3.2 超时重传机制 3.3 …

最新最详细的Mastercam安装包下载安装教程(保姆级)

正如大家所熟悉的&#xff0c;Mastercam是一款基于PC平台的CAD/CAM软件&#xff0c;集二维绘图、三维实体造型、曲面设计、体素拼合、数控编程、刀具路径摸拟及真实感摸拟等多种功能于一身。 Mastercam发展至今有许多个版本&#xff0c;目前来说常用的版本有Mastercam V91、20…

Windows同时配置两个jdk环境变量

项目场景&#xff1a; Windows同时配置两个jdk环境变量 解压版那么可以更改JAVA_HOME的值&#xff0c;来决定使用哪个版本。安装版可以两个版本同时使用。 操作步骤 1、配置环境变量 在系统环境变量中添加两个环境变量&#xff0c;根据使用需求更改JAVA_HOME的值 2、修改ja…

mariadb实现冷备份与恢复操作案例(物理冷备份,周期性备份)详解

文章目录 前置环境一、物理冷备份1.备份2.恢复检查结果 补充&#xff1a; 周期性恢复操作 前置环境 主机ipmariadb1192.168.10.11mariadb2192.168.10.12 mairadb1操作 安装mariadb yum -y install mariadb-server启动mariadb systemctl start mariadb这里只是演示备份与恢复…

数据结构不再难懂:带你轻松搞定排序算法

数据结构入门学习&#xff08;全是干货&#xff09;——排序算法&#xff08;下&#xff09; 1 快速排序 1.1 算法概述 快速排序采用分而治之的策略&#xff0c;与归并排序相似。其核心在于选择一个主元&#xff08;pivot&#xff09;作为分割点。 分而治之 主元(pivot)>…

【病毒分析】新兴TOP2勒索软件!存在中国受害者的BianLian勒索软件解密原理剖析

1. 概述 近期&#xff0c;笔者在浏览网络中威胁情报信息的时候&#xff0c;发现美国halcyon.ai公司于2024年3月25日发布了一篇《Ransomware on the Move: LockBit, BianLian, Medusa, Hunters International》报告&#xff0c;此报告对当前勒索软件团伙的实力进行了排名&#…

裸土检测算法实际应用、裸土覆盖检测算法、裸土检测算法

裸土检测算法主要用于环境保护、农业管理、城市规划和土地管理等领域&#xff0c;通过图像识别技术来检测和识别地表上的裸露土壤。这种技术可以帮助管理者实时监控裸土面积&#xff0c;及时采取措施&#xff0c;防止水土流失、环境污染和生态退化。 一、技术实现 裸土检测算…

【第二轮通知】第二届网络、通信与智能计算国际会议(NCIC 2024)

NCIC 2024|第二届网络、通信与智能计算国际会议 2024年11月22日-25日 中国 | 北京 www.icncic.org 重要日期 二轮截稿时间&#xff1a;2024年10月15日 注册截止时间&#xff1a;2024年11月10日 会议日期&#xff1a;2024年11月22日-25日 第二届网络、通信与智能计算国际会…

ProgrammerAI—AI辅助编程学习指南

前言 随着AIGC&#xff08;AI生成内容&#xff09;技术的快速发展&#xff0c;诸如ChatGPT、MidJourney和Claude等大语言模型相继涌现&#xff0c;AI辅助编程工具正逐步改变程序员的工作方式。这些工具不仅可以加速代码编写、调试和优化过程&#xff0c;还能帮助解决复杂的编程…

【深度学习】注意力机制与自注意力机制详解

深度学习中的注意力机制/自注意力机制详解 1. 注意力机制的通俗理解2. 注意力和自注意力机制的区别3. 自注意力机制原理与计算流程3.1 引入自注意力机制的目的与思想3.2 从向量角度理解 [R1]3.3 从Self-Attention核心公式理解 [R3] 4. 多头自注意力机制&#xff08;Multi-head …

网络威慑战略带来的影响

文章目录 前言一、网络威慑的出现1、人工智能带来的机遇二、网络空间的威慑困境1、威慑概念的提出2、网络威慑的限度3、人类对网络威胁的认知变化4、网络空间的脆弱性总结前言 网络威慑是国家为应对网络空间风险和威胁而采取的战略。冷战时期核威慑路径难以有效复制至网络空间…

HT6881 4.7W防削顶单声道音频功率放大器

特点 防削顶失真功能(Anti-Clipping Function,ACF) AB类/D类切换 优异的全带宽EMI抑制性能 免滤波器数字调制&#xff0c;直接驱动扬声器 输出功率 1.4W (VDD3.6V, RL4Ω, THDN10%, Class D) 2.8W (VDD5.0V, RL4Ω, THDN10%, ClassD) 4.7W(VDD6.5V,RL40,THDN10%, ClassD) 2.5W …

【环境踩坑系列】centos7安装python3.10.X

前言 虽然centOS8已经发布了相当一段时间了&#xff0c;但是基于稳定性、成熟的社区等原因&#xff0c;大家在选择centOS作为服务器操作系统的时候仍然会选择centOS7作为首选。但是centOS7自带的是python2.7.5&#xff0c;当前大量的python程序要用到的又是python3&#xff0c…

网络原理之IP协议(网络层)

目录 前言 什么是IP协议&#xff1f; IP协议的协议头格式 16位总长度&#xff08;字节数&#xff09; 16位标识、3位标志位和13位片偏移 8位生存时间 IP地址管理 1.动态分配IP 2.NAT机制&#xff08;网络地址转换&#xff09; NAT机制是如何工作的 NAT机制的优缺点…

监控易监测对象及指标之:全面监控Oracle ODBC数据库

在数字化时代&#xff0c;数据库作为存储和管理企业核心数据的基石&#xff0c;其稳定性和性能直接关系到业务的连续性和效率。Oracle数据库以其强大的功能和稳定性&#xff0c;广泛应用于各行各业。为了确保Oracle数据库的稳定运行和高效性能&#xff0c;对其进行全面监控显得…

阴影的基本原理

1、现实中阴影的产生规则 如图所示&#xff0c;现实中的阴影产生规则是&#xff0c;在不考虑光线反射的前提下&#xff0c;当一个光源发射的一条光线遇到一个不透明物体A时&#xff0c;这条光线就不能够再继续照亮其他物体了&#xff08;物体B的一部分&#xff09;&#xff0c…

ChatGPT 向更多用户推出高级语音模式:支持 50 种语言;字节发布两款新视频生成大模型丨 RTE 开发者日报

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE&#xff08;Real-Time Engagement&#xff09; 领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「…

AutosarMCAL开发——基于EB MCU驱动

这里写目录标题 1.MCU模块的作用2.EB配置以及接口应用3.总结 1.MCU模块的作用 MCU模块主要分为三部分&#xff1a; McuGeneralConfiguration MCU通用配置&#xff08;一般保持默认&#xff09;McuHardwareResourceAllocationConf 硬件资源分配管理器&#xff08;用于连接不同…