C++20 STL CookBook2 更强大的编译时 + 安全比较 + spaceship比较符

news2024/11/8 20:41:46

目录

使用编译时vector和字符串相关的上下文变量

安全的比较整数

<=> :)


使用编译时vector和字符串相关的上下文变量

在大部分C语言程序中,我见过不少人是这样使用常量字符串的:

#define STR "Hello, C++"

然后可能传递进入一些函数做一些可能跟字符串本身存储字符无关的运算。但是C++中,除非控制编译流程,实在不建议使用宏。那有没有代替品呢?有!我们可以使用一些编译时就可以确定的东西传递:

#include <iostream>
static constexpr const char* ready_calc = "string";
constexpr size_t gain_const_string() {
    return std::string(ready_calc).size();
}

或者:

constexpr auto check_sum(){
    std::vector<int> vec{1, 2, 3, 4, 5};
    return std::accumulate(std::begin(vec), std::end(vec), 0);
}

constexpr 说明符声明可在编译时求值的变量或函数。在 C++20 之前,这仅限于用文字值初始化的对象或有限约束内的函数。C++17 允许稍微扩展用途,而 C++20 进一步扩展了它。从 C++20 开始,STL 字符串和向量类现在具有 constexpr 限定的构造函数和析构函数,允许在编译时调用它们。这也意味着必须在编译时释放为字符串或向量对象分配的内存。

安全的比较整数

典中典例子:

int x{ -3 };
unsigned y{ 7 };
if(x < y) puts("true");
else puts("false");

它会打印 false。

问题是 x 是有符号的,而 y 是无符号的。标准化行为是将有符号类型转换为无符号以进行比较。这似乎违反直觉,不是吗?事实上,将无符号值转换为相同大小的有符号值,因为有符号整数使用二进制补码表示法(使用最高有效位作为符号)。给定相同大小的整数,最大有符号值是无符号值的一半。使用此示例,如果整数是 32 位,-3(有符号)将变为 FFFF FFFD(十六进制),或 4,294,967,293(无符号十进制),不小于 7。

这下看懂,那有没有办法避免这种抽象错误呢?有:

#include <utility>
int main() {
    int x{ -3 };
    unsigned y{ 7 };
    if(cmp_less(x, y)) puts("true");
    else puts("false");
}

这个玩意好说:实际上就是模板转化一下:

template< class T, class U >
constexpr bool cmp_less( T t, U u ) noexcept
{
    using UT = make_unsigned_t<T>;
    using UU = make_unsigned_t<U>;
    if constexpr (is_signed_v<T> == is_signed_v<U>)
        return t < u;
    else if constexpr (is_signed_v<T>)
        return t < 0 ? true : UT(t) < u;
    else
        return u < 0 ? false : t < UU(u);
}

<=> :)

Spaceship运算符!哈哈,这个东西用来化简比较运算符的

三向比较的工作方式不同。它返回三种状态之一。如果操作数相等,宇宙飞船运算符将返回等于 0 的值;如果左侧操作数小于右侧操作数,则返回负值;如果左侧操作数大于右侧运算符,则返回正值。

 const int a = 7; const int b = 42; static_assert((a <=> b) < 0); 

返回的值不是整数。它是 <compare> 标头中的一个对象,与 0 进行比较。 如果操作数具有整数类型,则运算符从 <compare> 库中返回一个 strong_ordering 对象。

  • strong_ordering::equal // 操作数相等

  • strong_ordering::less // lhs 小于 rhs

  • strong_ordering::greater // lhs 大于 rhs

如果操作数具有浮点类型,则运算符返回 partial_ordering 对象:

  • partial_ordering::equivalent // 操作数相等

  • partial_ordering::less // lhs 小于 rhs

  • partial_ordering::greater // lhs 大于 rhs

  • partial_ordering::unordered // 如果操作数无序

这些对象旨在使用常规比较运算符(例如,(a <=> b) < 0)与文字零 (0) 进行比较。这使得三向比较的结果比传统比较更精确。 如果这一切看起来有点复杂,那没关系。它的真正威力在于它作为对象的统一比较运算符的应用。

当然还可以自己定义:

struct Frac {
    long n;
    long d;
    constexpr Frac(int a, int b) : n{a}, d{b} {}
    constexpr double dbl() const {
        return static_cast<double>(n) / 
          static_cast<double>(d);
    }
    constexpr auto operator<=>(const Frac& rhs) const {
        return dbl() <=> rhs.dbl();
    };
    constexpr auto operator==(const Frac& rhs) const {
        return dbl() <=> rhs.dbl() == 0;
    };
};

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

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

相关文章

使用最新版的wvp和ZLMediaKit搭建Gb28181测试服务器

文章目录 说明安装1.安装nodejs简介安装步骤 2.安装java环境3.安装mysql安装修改密码 4.安装redis5.安装编译器6.安装cmake7.安装依赖库8.编译ZLMediaKit9.编译wvp-GB28181-pro 配置1.ZLMediaKit配置2.wvp-GB28181-pro配置2.1.配置ZLMediaKit连接信息2.2.28181服务器的配置2.3.…

AutoOps 使每个 Elasticsearch 部署都更易于管理

作者&#xff1a;来自 Elastic Ziv Segal&#xff0c;Ori Shafir AutoOps for Elasticsearch 通过性能建议、资源利用率和成本洞察、实时问题检测和解决路径显著简化了集群管理。 虽然 Elasticsearch 是一款功能强大且可扩展的搜索引擎&#xff0c;可提供多种功能&#xff0c;但…

Excel:vba实现正则匹配

一、匹配数字 实现的效果&#xff1a;(点击右边“提取数字”按钮) 实现的代码&#xff1a; Sub 提取数字() Dim cell As Range Dim sj As Object Dim regx As Object Dim ss As Object Dim n As Integer创建了一个 VBScript 正则表达式对象 regx&#xff0c;用于匹配特定模式…

第三十五篇:HTTP报文格式,HTTP系列二

HTTP 是超⽂本传输协议&#xff0c;也就是HyperText Transfer Protocol。 前面我们讲到第三章中网络协议的定义&#xff0c;网络协议的定义&#xff1a;网络协议是通信计算机双方必须共同遵从的一组约定。就像两个人要进行交流&#xff0c;如果不制定一套约定&#xff0c;一方…

[JAVAEE] 面试题(四) - 多线程下使用ArrayList涉及到的线程安全问题及解决

目录 一. 多线程下使用ArrayList 1.1. 自行判断加锁 1.2 使用Collections.synchronizedList()套壳加锁 1.3 CopyOnWriteArrayList类 二. 总结 一. 多线程下使用ArrayList 多线程下使用ArrayList会涉及到线程安全问题, 例如: public static void main(String[] args) thro…

使用axois自定义基础路径,自动拼接前端服务器地址怎么办

请求路径&#xff1a; http://localhost:5173/http://pcapi-xiaotuxian-front-devtest.itheima.net/home/category/head 很明显多拼接了路径地址 查看基础路径文件发现&#xff1a; //axios基础封装 import axios from axiosconst httpInstance axios.create({baseURL: /h…

docker镜像仓库常用命令

docker镜像仓库常用命令 docker logindocker logoutdocker pulldocker pushdocker searchdocker imagesdocker image inspectdocker tagdocker rmidocker image prunedocker savedocker loaddocker history docker login 语法: docker login [options] [server] 功能&#xff…

itextpdf打印A5的问题

使用A5打印的时候&#xff0c;再生成pdf是没有问题的。下面做了一个测试&#xff0c;在打印机中&#xff0c;使用A5的纸张横向放入&#xff0c;因为是家用打印机&#xff0c;A5与A4是同一个口&#xff0c;因此只能这么放。 使用itextpdf生成pdf&#xff0c;在浏览器中预览pdf是…

python项目实战---使用图形化界面下载音乐

音乐下载 设计思路&#xff1a; 设计界面编写爬虫代码绑定爬虫打包exe文件 这个是最终的设计成果&#xff0c;所有的下载歌曲都在“下载mp3”文件夹里面 完整代码 逻辑代码 import os.path import reimport requests from PyQt5.QtWidgets import QApplication,QWidget,QM…

Golang--协程和管道

1、概念 程序&#xff1a; 是为完成特定任务、用某种语言编写的一组指令的集合,是一段静态的代码。(程序是静态) 进程&#xff1a; 是程序的一次执行过程。正在运行的一个程序&#xff0c;进程作为资源分配的单位&#xff0c;在内存中会为每个进程分配不同的内存区域&#xff0…

C语言 | Leetcode C语言题解之第543题二叉树的直径

题目&#xff1a; 题解&#xff1a; typedef struct TreeNode Node;int method (Node* root, int* max) {if (root NULL) return 0;int left method (root->left, max);int right method (root->right, max);*max *max > (left right) ? *max : (left right);…

如何简化App Store提现?——作为游戏开发者的跨境收款体验分享

目录 如何简化App Store提现&#xff1f;——作为游戏开发者的跨境收款体验分享跨境收款常见的几个问题使用万里汇收款后的体验1. 结算流程简单&#xff0c;到账更快2. 多场景收付更灵活3. 多种支付方式支持 使用后的效果&#xff1a;资金管理更高效个人建议 如何简化App Store…

sql报错信息将字符串转换为 uniqueidentifier 时失败

报错信息&#xff1a; [42000] [Microsoft][SQL Server Native Client 10.0][SQL Server]将字符串转换为 uniqueidentifier 时失败 出错行如下&#xff1a; 表A.SourceCode 表B.ID 出错原因&#xff1a; SourceCode是nvarchar,但ID是uniqueidentifier 数据库查询字段和类…

【简信CRM-注册安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…

DevOps业务价值流:架构设计最佳实践

系统设计阶段作为需求与研发之间的桥梁&#xff0c;在需求设计阶段的原型设计评审环节&#xff0c;尽管项目组人员可能未完全到齐&#xff0c;但关键角色必须到位&#xff0c;包括技术组长和测试组长。这一安排旨在同步推进两项核心任务&#xff1a;一是完成系统的架构设计&…

分享:文本转换工具:PDF转图片,WORD转PDF,WORD转图片

前言 鉴于网上大多数在线转换工具要么需要收费&#xff0c;要么免费后但转换质量极差的情况&#xff0c;本人开发并提供了PDF转图片&#xff0c;WORD转PDF&#xff0c;WORD转图片等的文本转换工具。 地址 http://8.134.236.93/entry/login 账号 账号&#xff1a;STAR001&a…

sublime可以写python吗

首先你需要安装一个Sublime Text&#xff08;http://www.sublimetext.com/&#xff09;和一个Python&#xff08;https://www.python.org/downloads/&#xff09;&#xff0c; 接下来打开Sublime Text&#xff1a; 1、如下图所示&#xff0c;点击菜单栏中的Tools —> Buil…

聊一聊Elasticsearch的基本原理与形成机制

1、搜索引擎的基本原理 通常搜索引擎包括&#xff1a;数据采集、文本分析、索引存储、搜索等模块&#xff0c;它们之间的协作流程如下图&#xff1a; 数据采集模块负责采集需要搜索的数据源。 文本分析模块是将结构化数据中的长文本切分成有实际意义的词&#xff0c;这样用户…

IO流篇(一、File)

目录 一、学习前言 二、文件简介 三、文件使用 1. 绝对路径 vs 相对路径 2. 路径分隔符 3. 属性&#xff08;字段&#xff09; 4. 构造方法 5. 常用方法 5.1. 获取文件的相关信息 5.2. 判断功能 5.3. 新建和删除 5.4. 文件的获取 5.5. 重命名文件 四、文件使用练习…

【部署glm4】属性找不到、参数错误问题解决(思路:修改模型包版本)

前言&#xff1a;在部署glm时&#xff0c;遇到了一些属性找不到、参数错误的问题&#xff0c;通常遇到这种问题都是因为模型包版本问题导致的&#xff0c;要注意模型版本是否可用。 【运行官方vllm_cli_demo.py】报错 GLM-4: [rank0]: Traceback (most recent call last): [ran…