c++20 的部分新概念及示例代码-Contracts,Ranges

C++20 引入了 contracts(契约),这是一种编程范式,它允许程序员在代码中添加先决条件(preconditions)、后置条件(postconditions)和断言(assertions)等契约,以提高代码的可读性、可维护性和可靠性。这些契约可以在编译时和运行时进行检查,有助于发现并修复潜在的错误。

以下是一些关于 C++20 中 contracts 的基本信息:

  1. 先决条件(Preconditions):在函数开始执行之前,检查输入参数的有效性或者环境条件的满足情况。如果前置条件不满足,则契约失败,程序可以选择中止执行或者采取其他处理方式。

    #include <cassert>void foo(int x) {assert(x > 0 && x < 100); // 先决条件// 函数体
    }
    

    后置条件(Postconditions):在函数执行结束时,检查函数返回值或者对象状态是否符合预期。如果后置条件不满足,则契约失败,程序可以选择中止执行或者采取其他处理方式。

    #include <cassert>int bar() {int result = calculate_result();assert(result >= 0); // 后置条件return result;
    }
    

    断言(Assertions):在代码中插入断言来检查某个特定条件是否满足。如果断言失败,则契约失败,程序可以选择中止执行或者采取其他处理方式。

    #include <cassert>void baz(int* ptr) {assert(ptr != nullptr); // 断言// 使用 ptr 指针
    }
    

Ranges 库,它提供了一组用于操作范围(例如容器、数组、迭代器等)的标准库组件,以更简洁、清晰和高效地处理数据。Ranges 库主要包括以下几个方面的功能和概念:

  1. 范围(Range):表示一个数据序列,可以是容器、数组、迭代器范围等。范围提供了一种统一的方式来处理数据,而不需要关心底层数据结构的具体细节。

  2. #include <iostream>
    #include <vector>
    #include <algorithm>
    #include <ranges>int main() {std::vector<int> numbers = {1, 2, 3, 4, 5};// 使用范围算法对范围进行操作auto result = std::ranges::transform(numbers, [](int x) { return x * 2; });// 打印结果for (int num : result) {std::cout << num << " ";}std::cout << std::endl;return 0;
    }
    

  3. 视图(View):提供了一种对范围进行转换、筛选或者映射的机制,而不会修改原始数据。视图使得数据处理操作更加灵活,并且可以链式调用多个操作。

  4. 算法(Algorithm):Ranges 库包含了一系列与范围相关的算法,如查找、排序、转换等,这些算法可以直接应用于范围上,而无需手动管理迭代器。

  5. 迭代器(Iterator):Ranges 库引入了一些新的迭代器概念,如输入迭代器、输出迭代器、前向迭代器、双向迭代器、随机访问迭代器等,以支持不同类型范围的操作。

  6. 函数式编程(Functional Programming):Ranges 库提供了一些函数式编程风格的操作,如映射(map)、过滤(filter)、折叠(fold)等,使得代码更加简洁和易读。

 

#include <iostream>
#include <vector>
#include <ranges>int main() {std::vector<int> numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};// 使用视图过滤出偶数auto even_numbers = numbers | std::views::filter([](int x) { return x % 2 == 0; });// 使用视图转换为字符串auto str_numbers = even_numbers | std::views::transform([](int x) { return std::to_string(x); });// 打印转换后的字符串for (const auto& str : str_numbers) {std::cout << str << " ";}std::cout << std::endl;return 0;
}

我们首先定义了一个整数数组 numbers,然后使用视图过滤出其中的偶数,再使用视图将偶数转换为字符串,并最终打印转换后的字符串。这个示例展示了如何利用 Ranges 库的功能,以一种简洁和清晰的方式操作数据。

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

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

相关文章

数据结构——二叉树——二叉搜索树(Binary Search Tree, BST)

目录 一、98. 验证二叉搜索树 二、96. 不同的二叉搜索树 三、538. 把二叉搜索树转换为累加树 二叉搜索树&#xff1a;对于二叉搜索树中的每个结点&#xff0c;其左子结点的值小于该结点的值&#xff0c;而右子结点的值大于该结点的值 一、98. 验证二叉搜索树 给你一个二叉树的…

P6维护:Oracle P6服务性能优化

前言 本文将介绍如何对ORACLE Primavera P6 EPPM软件进行性能调优&#xff0c;考虑到P6主要采用JAVA语言编制&#xff0c;且其使用的是Weblogic Server应用服务器部署P6各项服务器&#xff0c;其性能优化的原理便是基于其JVM特征参数进行设置 方法一&#xff1a;修改配置文件…

Flutter Key 讲解

key --- Value 模式模式下&#xff0c;value就是我们的widget 为什么要有key&#xff1f; flutter中是增量更新&#xff0c;只更新了差异点。 任何的恶widget都有key。 有些时候不使用key。会导致渲染引擎失控&#xff0c;更新的时候没有参考物key. 为什么会有上面失控的情…

Maplesoft Maple 2024(数学科学计算)mac/win

Maplesoft Maple是一款强大的数学计算软件&#xff0c;提供了丰富的功能和工具&#xff0c;用于数学建模、符号计算、数据可视化等领域的数学分析和解决方案。 Mac版软件下载&#xff1a;Maplesoft Maple 2024 for mac激活版 WIn版软件下载&#xff1a;Maplesoft Maple 2024特别…

银行业架构网络BIAN (Banking IndustryArchitecture Network)详细介绍

BIAN ( The Banking Industry Architecture Network) 是一个业界多方协作的非营利性组织&#xff0c;由全球领先银行、技术提供商、顾问和学者组成&#xff0c;定义了一个用以简化和标准化核心银行体系结构的银行技术框架。这一框架基于面向服务的架构 (SOA) 原则&#xff0c;银…

Docker工作流

1.工作流 开发应用编写Dockerfile构建Docker镜像运行Docker容器测试应用发布镜像到Hub迭代更新镜像 2.开发应用 首先你需要创建一个应用&#xff0c;这个应用可以是后端应用或者前端应用&#xff0c;任何语言都可以。 比如&#xff1a;我使用IDEA 创建一个Java后端应用&…

Vue项目中引入html页面(vue.js中引入echarts数据大屏html [静态非数据传递!] )

在项目原有vue&#xff08;例如首页&#xff09;基础上引入html页面 1、存放位置 vue3原有public文件夹下 我这边是新建一个static文件夹 专门存放要用到的html文件 复制拖拽过来 index为html的首页 2、更改路径引入到vue中 这里用到的是 iframe 方法 不同于vue的 component…

设计模式 - Mixin模式

混入&#xff08;Mixin&#xff09;是一个对象&#xff0c;我们可以使用它来向另一个对象或类添加可重用的功能&#xff0c;而无需使用继承。我们无法独立使用混入&#xff0c;它的唯一目的是向对象或类添加功能&#xff0c;而不使用继承。 比如说&#xff0c;在我们的应用程序…

权限认证SpringCloud GateWay、SpringSecurity、OAuth2.0、JWT一网打尽!

权限认证SpringCloud GateWay、SpringSecurity、OAuth2.0、JWT一网打尽 一、SpringCloud GateWay 1.它是如何工作的&#xff1f; ​ 客户端向 Spring Cloud Gateway 发出请求。如果Gateway处理程序映射确定一个请求与路由相匹配&#xff0c;它将被发送到Gateway Web处理程序。…

【Go】七、包、init函数、匿名函数、闭包

文章目录 1、包2、本质3、init函数4、匿名函数5、闭包 1、包 不同的包&#xff0c;不同的功能和业务&#xff0c;互相import 关于包&#xff1a; package 包名注意点&#xff1a; 建议包名和所在文件夹同名 main函数一定要放在main包下&#xff0c;否则编译报错 go run&a…

maven 请出缓存,重新拉取依赖

要让Maven清除本地仓库的缓存并重新下载依赖&#xff0c;你可以使用以下几种方法&#xff1a; 1. 强制更新快照&#xff08;Snapshot&#xff09;依赖 对于快照版本的依赖&#xff0c;Maven提供了一个简单的命令行选项来强制更新本地仓库中的快照版本&#xff0c;而不需要清除…

IP归属地在互联网行业中的应用

摘要&#xff1a;IP&#xff08;Internet Protocol&#xff09;地址归属地是指互联网上某个IP地址所对应的地理位置信息。在互联网行业中&#xff0c;IP归属地具有重要的应用价值&#xff0c;包括网络安全、广告定向、用户定位等方面。IP数据云将探讨IP归属地在互联网行业中的应…

3d怎么两个模型连接圆润?---模大狮模型网

在3D建模中&#xff0c;如何实现两个3d模型的圆润连接是一个常见而又关键的问题。无论是为了美观的外观设计还是为了模型的功能性&#xff0c;圆润连接都能够增加模型的整体质感和流畅度。模大狮将介绍一些常见的方法和技巧&#xff0c;帮助您实现两个模型之间的圆润连接。 一、…

Linux如何连接github仓库

一.创建一个github账号 如何创建一个github账号 二.在github上创建一个仓库 登录上github后出现这个界面 然后点击左上角头像&#xff0c;在按照图片位置点击&#xff1a; 继续按照图片上的位置进行点击&#xff1a; 创建成功&#xff1a; 三.云主机连接Github仓库 1.在linux中…

Hadoop系列总结

一、Hadoop linux基本操作 前提掌握Linux基本操作 参考 Linux基本操作-CSDN博客 1、查看hadoop指定路径下文件大小前6的文件信息 hdfs dfs[hadoop fs] -du -h /path/to/directory|sort -hr|head -n 6

宝塔 docker 安装 rabbitmq

点击宝塔目录docker 拉取镜像 docker pull rabbitmq:management创建rabbitmq容器 docker run -d --name rabbit -e RABBITMQ_DEFAULT_USERadmin -e RABBITMQ_DEFAULT_PASSadmin -p 15672:15672 -p 5672:5672 -p 25672:25672 -p 61613:61613 -p 1883:1883 rabbitmq:managemen…

支持向量机(Support Vector Machine,SVM)的功能及用法

支持向量机&#xff08;Support Vector Machine&#xff0c;SVM&#xff09;是一种监督学习算法&#xff0c;主要用于分类和回归分析。其基本思想是找到一个超平面&#xff0c;将不同类别的样本分开&#xff0c;并使得该超平面到最近的样本点的距离&#xff08;即支持向量&…

深度学习-计算机视觉入门-part1

计算机视觉入门 文章目录 计算机视觉入门一、 从卷积到卷积神经网络1.图像的基本表示2. 卷积操作3.卷积遇见深度学习3.1 通过学习寻找卷积核3.2 参数共享&#xff1a;卷积带来参数量骤减3.3 稀疏交互&#xff1a;获取更深入的特征 二、手撕卷积代码三、经典CNN模型介绍四、CNN模…

skywalking idea中启动调试报错Output path is shared between the same module error

报错信息 简单描述&#xff1a;就是多个moudle一样用了一样的输出路径&#xff0c;这样容易造成冲突 Output path is shared between the same module error 参考&#xff1a;scala - Output path is shared between the same module error - Stack Overflow 解决方法&…

机器学习(四)

贝叶斯分类器与贝叶斯学习: 贝叶斯分类器:只要是一种生成式模型&#xff0c;并且使用到了贝叶斯公式 贝叶斯学习:一定在使用分布估计 贝叶斯分类器并不等于贝叶斯学习 极大似然估计: 先假设某种概率分布形式&#xff0c;再基于训练样例对参数进行估计 集成学习: 如何得到…