C++20 新特征:Ranges库初探

news/2024/9/18 5:21:25/ 标签: c++20, C++20新特征, 开发语言
引言

C++20引入了多个令人兴奋的新特性,其中最为突出的是Ranges库。Ranges库是标准模板库(STL)的重要扩展,旨在简化和优化序列数据的处理。本文将深入浅出地介绍Ranges库的核心组件及其对C++编程带来的改进。

什么是Ranges库?

Ranges库提供了一套全新的工具集,用于处理序列数据(如数组、向量等)。它由三部分组成:范围(Ranges)、视图(Views)和适配器(Adapters)。

  • 范围(Ranges):表示一组元素,可以是任何拥有开始和结束迭代器的数据结构。
  • 视图(Views):一种特殊的范围,它不拥有数据的所有权,而是提供一种轻量级的方式来观察底层数据。
  • 适配器(Adapters):可以修改视图的行为,例如反转元素顺序或过滤某些元素。
核心组件详解
范围(Ranges)

在C++20之前,处理序列通常需要手动管理迭代器。现在,通过<ranges>头文件中的API,我们可以更加高效地处理序列。例如,一个简单的范围可以是一个数组或一个std::vector

视图(Views)

视图是Ranges库中最具创新的部分之一。它们允许你在不改变原始数据的情况下操作序列。常见的视图操作包括std::views::reverse(反转)、std::views::filter(过滤)等。

适配器(Adapters)

适配器可以改变视图的行为。例如,std::views::drop可以丢弃序列中的前几个元素,而std::views::transform可以对序列中的每个元素应用一个函数。

实例演示

让我们通过一些具体的例子来展示如何使用Ranges库,并具体说明它带来的改进:

#include <iostream>
#include <vector>
#include <ranges>int main() {std::vector<int> numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};// 示例1:打印所有偶数std::cout << "Even numbers:" << std::endl;for (auto n : numbers | std::views::filter([](int n) { return n % 2 == 0; })) {std::cout << n << ' ';}std::cout << '\n';// 示例2:反向打印std::cout << "Reversed sequence:" << std::endl;for (auto n : numbers | std::views::reverse) {std::cout << n << ' ';}std::cout << '\n';// 示例3:筛选偶数并平方std::cout << "Squared even numbers:" << std::endl;for (auto n : numbers | std::views::filter([](int n) { return n % 2 == 0; }) | std::views::transform([](int n) { return n * n; })) {std::cout << n << ' ';}std::cout << '\n';// 示例4:排序后打印std::cout << "Sorted sequence:" << std::endl;auto sorted_numbers = numbers | std::views::all | std::views::common;std::ranges::sort(sorted_numbers);for (auto n : sorted_numbers) {std::cout << n << ' ';}std::cout << '\n';return 0;
}
Ranges库带来的改进

Ranges库为C++编程带来了诸多改进:

  • 代码可读性:通过使用管道操作符|,你可以将多个操作链接起来,使得代码更加直观。例如,在上面的示例中,我们通过一系列的视图操作来过滤偶数、平方和排序,代码结构清晰,易于理解。

    for (auto n : numbers | std::views::filter([](int n) { return n % 2 == 0; }) | std::views::transform([](int n) { return n * n; }))std::cout << n << ' ';
    
  • 惰性求值:许多视图操作都是惰性的,这意味着它们只有在真正需要的时候才会计算结果,这可以节省大量的计算资源。例如,当你使用std::views::filterstd::views::transform时,计算是在每次迭代时才进行的。

  • 灵活性:由于视图不会拥有数据,因此可以轻松地组合多个视图操作,而无需担心数据的复制或移动。在上面的例子中,我们可以通过简单地添加更多视图操作来修改数据处理流程。

  • 效率:尽管提供了高度的抽象,但Ranges库设计得非常高效,甚至可以比传统的迭代器方法更快。例如,std::ranges::sort和其他算法都经过了优化,以确保高性能。

结论

C++20的Ranges库是一个强大的工具,它简化了序列处理,并使得代码更加清晰和高效。通过学习和应用Ranges库,C++开发者可以写出更加现代化的代码,更好地应对复杂的数据处理任务。无论你是新手还是经验丰富的开发者,掌握Ranges库都将极大地提升你的编程能力。


http://www.ppmy.cn/news/1525848.html

相关文章

【nginx】ngx_http_proxy_connect_module 正向代理

50.65无法访问 服务器, (403 错误) 50.196 可以访问服务器。 那么,配置65 通过196 访问。 需要一个nginx作为代理 【nginx】搭配okhttp 配置反向代理 发送原生的nginx是不支持okhttp的CONNECT请求的。 大神竟然给出了一个java工程 GINX编译ngx_http_proxy_connect_module及做…

计算机毕业设计选题推荐-勤工俭学兼职系统-助学兼职系统-Java/Python项目实战(亮点:手机验证码验证+数据可视化)

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

MySQL权限控制(DCL)

我的mysql里面的一些数据库和一些表 基本语法 1.查询权限 show grants for 用户名主机名;例子1&#xff1a;查询权限 show grants for heima%;2.授予权限 grant 权限列表 on 数据库名.表名 to 用户名主机名;例子2&#xff1a; 授予权限 grant all on itcast.* to heima%;…

阿里短信服务+Redis创建定时缓存

在这一章进行的操作是在java中引入阿里云的短信服务接口,在发送短信的时候将短信存进Redis缓存数据库中并且对缓存数据添加倒计时为五分钟 首先 找到阿里云服务的短信服务 例: 【三网106短信】短信接口-短信验证码-短信通知-数字藏品短信-短信API_支持转网_自定义签名模板-A…

CSP程序填空专项练习

已放在资源中&#xff0c;欢迎大家下载&#xff0c;距离初赛还有5天&#xff0c;祝大家成功&#xff01;

从单体到微服务:FastAPI ‘挂载’子应用程序的转变

在现代 Web 应用开发中&#xff0c;模块化架构是一种常见的设计模式&#xff0c;它有助于将大型应用程序分解为更小、更易于管理的部分。FastAPI&#xff0c;作为一个高性能的 Python Web 框架&#xff0c;提供了强大的支持来实现这种模块化设计。通过“挂载”子应用程序&#…

OSSEC搭建与环境配置Ubuntu

尝试使用Ubuntu配置了OSSEC&#xff0c;碰见很多问题并解决了&#xff0c;发表博客让后来者不要踩那么多坑 环境 &#xff1a; server &#xff1a;Ubuntu22.04 64位 内存4GB 处理器4 硬盘60G agent: 1.Windows11 64位 2.Ubuntu22.04 64位 服务端配置 一、配置安装依赖项&…

计算机网络 第三章: 封装成桢和透明传输

文章目录 封装成帧透明传输习题解析 封装成帧 封装成帧是指数据链路层给上层交付下来的协议数据单元PDU添加一个首部和一个尾部&#xff0c;使之成为帧。 帧的首部和尾部中包含有一些 重要的控制信息。帧首部和尾部的作用之一就是帧定界。 接收方的数据链路层如何从物理层交付…

基于人工智能的智能家居语音控制系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 随着物联网&#xff08;IoT&#xff09;和人工智能技术的发展&#xff0c;智能家居语音控制系统已经成为现代家庭的一部分。通过语音控…

【自学笔记】支持向量机(1)

一些概念 支持向量机&#xff08;Support Vector Machine&#xff0c;简称SVM&#xff09;是一种广受欢迎的监督学习算法&#xff0c;主要用于分类和回归分析。在分类问题中&#xff0c;SVM的主要目标是在训练数据中找到一个超平面。这个超平面不仅能够准确地区分不同类别的样本…

使用C++实现一个支持基本消息传递的TCP客户端和服务器

使用C实现一个支持基本消息传递的TCP客户端和服务器 在网络编程中&#xff0c;TCP&#xff08;Transmission Control Protocol&#xff09;是一种常用的协议&#xff0c;用于在计算机之间建立可靠的连接。通过实现一个TCP客户端和服务器&#xff0c;可以深入理解TCP协议的工作…

干货 | Selenium+chrome自动批量下载地理空间数据云影像

1.背景介绍 1.1地理空间数据云 由中国科学院计算机网络信息中心科学数据中心成立的地理空间数据云平台是常见的下载空间数据的平台之一。其提供了较为完善的公开数据&#xff0c;如LANDSAT系列数据&#xff0c;MODIS的标准产品及其合成产品&#xff0c;DEM数据&#xff08;SR…

社交媒体的未来:Facebook如何通过AI技术引领潮流

在数字化时代的浪潮中&#xff0c;社交媒体平台不断演变&#xff0c;以适应用户需求和技术发展的变化。作为全球领先的社交媒体平台&#xff0c;Facebook在这一进程中扮演了重要角色。尤其是人工智能&#xff08;AI&#xff09;技术的应用&#xff0c;正在深刻地改变Facebook的…

HTTP反向代理教学:轻松实现代理IP的妙用

在当今互联网时代&#xff0c;代理IP已经成为了很多人上网必不可少的工具。无论是为了保护隐私&#xff0c;还是为了更好地管理网络流量&#xff0c;代理IP都能发挥重要作用。今天&#xff0c;我们就来聊聊HTTP反向代理这个神奇的东西&#xff0c;教你如何轻松实现代理IP的妙用…

[git] MacBook 安装git

文章目录 1.Mac Git 安装2. 开发者工具安装 CommandLineTools安装完成&#xff0c;错误解决 3. git 账户配置账户设置生成秘钥git 或者 gitee 仓库添加公钥查看全局账户命令多账户设置config文件测试连接clone到本地 1.Mac Git 安装 Mac一般自带Git工具&#xff0c;也就是说已…

4K投影仪选购全攻略:全玻璃镜头的当贝F6,画面细节纤毫毕现

在当今的投影市场上&#xff0c;4K投影仪已经成了主流产品&#xff0c;越来越多家庭开始关注如何选择一款性价比高、口碑好的4K投影仪。4K投影仪其实指的是具备3840*2160像素分辨率投影仪&#xff0c;它能够提供更清晰、更细腻、更真实的画面效果。 那么4K投影仪该怎么选&…

uniapp child.onFieldChange is not a function

uni-forms // 所有子组件参与校验,使用 for 可以使用 awiatfor (let i in childrens) {const child childrens[i];let name realName(child.name);if (typeof child.onFieldChange function) {const result await child.onFieldChange(tempFormData[name]);if (result) {…

EasyExcel拿表头(二级表头)爬坑,invokeHeadMap方法

OK&#xff0c;不废话&#xff0c;直接开干!说实话是有些坑&#xff0c;或者是我不会用吧 模板如下&#xff1a; invokeHeadMap 这个方法其实针对第一行就是表头的完全没问题。针对第二行的&#xff0c;我DEBUG拿到的是这样很明显&#xff0c;他拿到了第一行&#xff1b;既然…

python知识点100篇系列(17)-替换requests的python库httpx

Requests 是使用 Apache2 Licensed 许可证的 基于Python开发的HTTP 库,其在Python内置模块的基础上进行了高度的封装,使用Requests可以轻而易举的完成浏览器可有的任何操作。 但是在python3.6之后,出现了一个requests的替代选项; httpx httpx是Python新一代的网络请求库…

【期末复习】软件项目管理

前言&#xff1a; 关于软件项目管理这一科目的重要期末考点&#xff0c;希望对你有帮助。 目录 质量管理可能遇到的问题 软件项目质量管理 软件项目风险管理 进度 题1 题2 题3 成本 题1 题2 题3 质量管理可能遇到的问题 (1)没有制定质量管理计划&#xff1a; (2)…