C++中Ranges库的基本用法,如何简化和增强对集合的操作。

Ranges库的基本用法

什么是Ranges库?

C++20引入的Ranges库(<ranges>)是一个强大的工具集,旨在简化和增强对集合(如数组、向量等序列容器)的操作。它提供了一套用于操作序列的功能性接口,使得代码更具可读性和表达力。

Ranges库的核心组件

  1. Views(视图):可以看作是懒惰求值的序列操作,它们不改变底层容器,而是提供一种延迟计算的方式,直到实际需要结果时才执行计算。
  2. Actions(动作):类似于视图,但它们是即时操作,会直接改变底层数据。
  3. Adaptors(适配器):用于将基本操作组合起来,生成复杂的操作序列。
  4. Range Factories(范围工厂):用于生成新的范围,例如std::views::iota可以生成一个从某个起点到终点的数值序列。

基本用法

1. 视图(Views)

视图是一种懒惰的、非变更性的操作,允许对序列进行筛选、转换和组合。常见的视图包括:

  • std::views::filter:过滤视图,根据给定的条件过滤序列中的元素。
  • std::views::transform:变换视图,对序列中的每个元素应用一个变换函数。
示例:过滤和转换
#include <iostream>
#include <vector>
#include <ranges>int main() {std::vector<int> numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};// 使用filter视图过滤出偶数auto even_numbers = numbers | std::views::filter([](int n) { return n % 2 == 0; });// 使用transform视图将每个数平方auto squared_numbers = even_numbers | std::views::transform([](int n) { return n * n; });// 输出结果for (int n : squared_numbers) {std::cout << n << " ";}return 0;
}

在这个示例中,even_numbers视图过滤出了偶数,squared_numbers视图将每个偶数平方。最终输出结果是过滤和转换后的序列。

2. 动作(Actions)

动作是即时执行的操作,会直接改变序列内容。在标准库中,动作的支持较少,通常需要使用第三方库(如Range-v3)才能看到完整的动作集合。

示例:排序和去重
#include <iostream>
#include <vector>
#include <ranges>
#include <algorithm>int main() {std::vector<int> numbers = {4, 2, 5, 1, 3, 2, 4, 5};// 使用std::ranges::sort进行排序std::ranges::sort(numbers);// 使用std::ranges::unique去重auto end_it = std::ranges::unique(numbers);numbers.erase(end_it.begin(), numbers.end());// 输出结果for (int n : numbers) {std::cout << n << " ";}return 0;
}

在这个示例中,std::ranges::sort对序列进行了排序,而std::ranges::unique则移除了重复的元素。

3. 适配器(Adaptors)

适配器是组合多个操作的工具。例如,我们可以将过滤和转换操作组合成一个适配器。

示例:组合过滤和转换
#include <iostream>
#include <vector>
#include <ranges>int main() {std::vector<int> numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};// 组合过滤和转换操作auto even_squared = numbers | std::views::filter([](int n) { return n % 2 == 0; })| std::views::transform([](int n) { return n * n; });// 输出结果for (int n : even_squared) {std::cout << n << " ";}return 0;
}

在这个示例中,我们将过滤和转换操作组合成了一个视图适配器,这使得代码更简洁。

4. 范围工厂(Range Factories)

范围工厂可以生成新的范围。例如,std::views::iota可以生成一个从起点到终点的数值序列。

示例:生成数值范围
#include <iostream>
#include <ranges>int main() {// 使用std::views::iota生成一个从0到9的序列auto numbers = std::views::iota(0, 10);// 输出结果for (int n : numbers) {std::cout << n << " ";}return 0;
}

这个示例中,std::views::iota生成了一个从0到9的数值序列。

Ranges库的优势

  1. 代码简洁:通过使用视图和适配器,代码可以更简洁地表达复杂的操作。
  2. 懒惰求值:视图操作是惰性求值的,只有在实际需要结果时才会进行计算,这可以提高性能,尤其是在处理大型数据集时。
  3. 更高的表达力:Ranges库的操作更具表达力,能更直观地表达数据操作的意图。
  4. 组合性:操作可以通过适配器进行组合,简化了复杂的操作链。

通过C++20的Ranges库,我们能够更加优雅和高效地处理集合操作,使得代码更加清晰、易读和易于维护。

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

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

相关文章

独立站新风口:TikTok达人带货背后的双赢合作之道

TikTok以其庞大的用户基础、高度互动性和创新的内容形式&#xff0c;为独立站带来了前所未有的发展机遇。独立站与TikTok达人的合作&#xff0c;不仅能够帮助独立站快速提升品牌知名度和销售额&#xff0c;还能为TikTok达人带来更多商业机会和影响力。本文Nox聚星将和大家探讨独…

Android sdk 安装已经环境配置

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;Android ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 正文 一、下载 二、安装 三、环境配置 我的其他博客 正文 一、下载 1、大家可去官网下载 因为需要魔法 所以就不展示了 2、去下面这…

经典shell运维实用脚本~

以下脚本可谓日常工作常用到的经典脚本案例。希望可以帮助大家提升提升自动化能力&#xff01; 1、监控100台服务器磁盘利用率脚本 #!/bin/bashHOST_INFOhost.infofor IP in $(awk /^[^#]/{print $1} $HOST_INFO); do USER$(awk -v ip$IP ip$1{print $2} $HOST_INFO) P…

【JS】纯web端使用ffmpeg实现的视频编辑器-视频合并

纯前端实现的视频合并 接上篇ffmpeg文章 【JS】纯web端使用ffmpeg实现的视频编辑器 这次主要添加了一个函数&#xff0c;实现了视频合并的操作。 static mergeArgs(timelineList) {const cmd []console.log(时间轴数据,timelineList)console.log("文件1",this.readD…

常用目标检测的格式转换脚本文件txt,json等

常用目标检测的格式转换脚本文件txt,json等 文章目录 常用目标检测的格式转换脚本文件txt,json等前言一、json格式转yolo的txt格式二、yolov8的关键点labelme打的标签json格式转可训练的txt格式三、yolo的目标检测txt格式转coco数据集标签的json格式四、根据yolo的目标检测训练…

Vue+ElementUi实现录音播放上传及处理getUserMedia报错问题

1.Vue安装插件 npm install --registryhttps://registry.npmmirror.com 2.Vue页面使用 <template><div class"app-container"><!-- header --><el-header class"procedureHeader" style"height: 20px;"><el-divid…

vue2 接口文档

const assetmanagementIndex (params) > getAction("/asset/assetmanagementsystem/page", params); //资产管理制度表分页列表 const assetmanagementPost (params) > postAction("/asset/assetmanagementsystem", params); //资产管理制度表新增…

维护Nginx千字经验总结

Hello , 我是恒 。 维护putty和nginx两个项目好久了&#xff0c;用面向底层的思路去接触 在nginx社区的收获不少&#xff0c;在这里谈谈我的感悟 Nginx的夺冠不是偶然 高速:一方面&#xff0c;在正常情况下&#xff0c;单次请求会得到更快的响应&#xff1b;另一方面&#xff0…

从零开始学量化~Ptrade使用教程——安装与登录

PTrade交易系统是一款高净值和机构投资者专业投资软件&#xff0c;为用户提供普通交易、篮子交易、日内回转交易、算法交易、量化投研/回测/实盘等各种交易工具&#xff0c;满足用户的各种交易需求和交易场景&#xff0c;帮助用户提高交易效率。 运行环境及安装 操作系统&…

昇思25天学习打卡营第3天 | 数据集 Dataset

数据是深度学习的基础&#xff0c;高质量的数据输入将在整个深度神经网络中起到积极作用。MindSpore提供基于Pipeline的数据引擎&#xff0c;通过数据集&#xff08;Dataset&#xff09;和数据变换&#xff08;Transforms&#xff09;实现高效的数据预处理。其中Dataset是Pipel…

将数据切分成N份,采用NCCL异步通信,让all_gather+matmul尽量Overlap

将数据切分成N份,采用NCCL异步通信,让all_gathermatmul尽量Overlap 一.测试数据二.测试环境三.普通实现四.分块实现 本文演示了如何将数据切分成N份,采用NCCL异步通信,让all_gathermatmul尽量Overlap 一.测试数据 1.测试规模:8192*8192 world_size22.单算子:all_gather:0.035…

代理IP的10大误区:区分事实与虚构

在当今的数字时代&#xff0c;代理已成为在线环境不可或缺的一部分。它们的用途广泛&#xff0c;从增强在线隐私到绕过地理限制。然而&#xff0c;尽管代理无处不在&#xff0c;但仍存在许多围绕代理的误解。在本博客中&#xff0c;我们将探讨和消除一些最常见的代理误解&#…

人脑网络的多层建模与分析

摘要 了解人类大脑的结构及其与功能的关系&#xff0c;对于各种应用至关重要&#xff0c;包括但不限于预防、处理和治疗脑部疾病(如阿尔茨海默病或帕金森病)&#xff0c;以及精神疾病(如精神分裂症)的新方法。结构和功能神经影像学方面的最新进展&#xff0c;以及计算机科学等…

OBS 免费的录屏软件

一、下载 obs 【OBS】OBS Studio 的安装、参数设置和录屏、摄像头使用教程-CSDN博客 二、使用 obs & 输出无黑屏 【OBS任意指定区域录屏的方法-哔哩哔哩】 https://b23.tv/aM0hj8A OBS任意指定区域录屏的方法_哔哩哔哩_bilibili 步骤&#xff1a; 1&#xff09;获取区域…

012-GeoGebra基础篇-构造圆的切线

前边文章对于基础内容已经悉数覆盖了&#xff0c;这一篇我就不放具体的细节&#xff0c;若有需要可以复刻一下 目录 一、成品展示二、算式内容三、正确性检查五、文章最后 一、成品展示 二、算式内容 A(0,0) B(3,0) c: Circle(A,B) C(5,4) sSegment(A,C) DMidpoint(s) d: Circ…

k8s部署单节点redis

一、configmap # cat redis-configmap.yaml apiVersion: v1 kind: ConfigMap metadata:name: redis-single-confignamespace: redis data:redis.conf: |daemonize nobind 0.0.0.0port 6379tcp-backlog 511timeout 0tcp-keepalive 300pidfile /data/redis-server.pidlogfile /d…

全网小视频去水印接口使用说明

一、请求地址&#xff1a; https://www.lytcreate.com/api/qsy/ 二、请求方式&#xff1a;POST 三、请求体&#xff1a;JSON body {"token": "个人中心的token","url": "视频分享地址"} token获取地址&#xff0c;访问&#xff…

uniapp微信小程序使用xr加载模型

1.在根目录与pages同级创建如下目录结构和文件&#xff1a; // index.js Component({properties: {modelPath: { // vue页面传过来的模型type: String,value: }},data: {},methods: {} }) { // index.json"component": true,"renderer": "xr-frame&q…

Element-plus点击当前行之后获取数据显示跟随行数据

要实现点击当前行后&#xff0c;在当前行的下方显示数据&#xff0c;可以通过以下步骤来实现&#xff1a; 在表格的行点击事件中获取当前点击行的位置信息。根据位置信息动态计算并设置需要显示数据区域的位置。 下面是一个更新后的示例代码&#xff0c;演示如何在 Element-P…

Unity 引擎收费模式变革:游戏开发者的挑战与机遇

Unity 引擎作为游戏开发领域中的重要工具&#xff0c;近日宣布将在 2024 年 1 月 1 日起根据游戏安装量对开发者进行收费。这一决定引起了业界的广泛关注和讨论。据 Unity 技术博客发布的《Unity 收费模式和配套服务更新》一文&#xff0c;他们选择这种计费方式是基于每次游戏被…