【现代C++】范围库的应用

在这里插入图片描述

C++20引入了范围库(Ranges library),它是标准模板库(STL)的一个扩展,提供了一种新的方式来处理序列和范围。这个库允许开发者以更声明式的方式编写代码,使得操作序列变得更简洁、更易读。以下是C++范围库的关键特性和使用示例:

1. ranges::view - 视图

视图是对数据范围的引用,而不会创建数据的副本。它们是延迟求值的,仅在需要时才计算元素。

#include <ranges>
#include <iostream>
#include <vector>void viewExample() {std::vector<int> nums = {0, 1, 2, 3, 4, 5};auto evenNums = nums | std::views::filter([](int n) { return n % 2 == 0; });for (int n : evenNums) {std::cout << n << ' ';  // 输出:0 2 4}
}

2. ranges::actions - 动作

动作类似于算法,但它们可以直接修改容器。

#include <ranges>
#include <vector>
#include <iostream>void actionExample() {std::vector<int> nums = {0, 1, 2, 3, 4, 5};nums |= std::ranges::actions::remove_if([](int n) { return n % 2 == 0; });for (int n : nums) {std::cout << n << ' ';  // 输出:1 3 5}
}

3. 管道操作

C++20范围库允许你以管道的方式链式调用算法,使得代码更加直观。

#include <ranges>
#include <iostream>
#include <vector>void pipelineExample() {std::vector<int> nums = {1, 2, 3, 4, 5, 6};auto result = nums| std::views::filter([](int n) { return n % 2 == 0; })| std::views::transform([](int n) { return n * n; });for (int n : result) {std::cout << n << ' ';  // 输出:4 16 36}
}

4. 惰性求值

范围操作通常是惰性求值的,这意味着计算会延迟进行,直到真正需要元素的值时才会执行。

#include <ranges>
#include <vector>
#include <iostream>void lazyEvaluationExample() {std::vector<int> nums = {1, 2, 3, 4, 5, 6};auto squares = nums | std::views::transform([](int n) { return n * n; });std::cout << *squares.begin() << std::endl;  // 输出:1 (只计算了第一个元素的平方)
}

5. 与现有STL算法的兼容性

C++20范围库设计时考虑了与现有STL算法的兼容性,让你可以无缝地在旧代码中应用新的范围功能。

#include <ranges>
#include <algorithm>
#include <vector>
#include <iostream>void compatibilityExample() {std::vector<int> nums = {1, 2, 3, 4, 5, 6};auto evenNums = nums | std::views::filter([](int n) { return n % 2 == 0; });std::cout << std::ranges::count(evenNums, 4) << std::endl;  // 输出:1
}

通过这些示例,你可以看到C++范围库如何提供一种更现代、更声明式的方式来处理序列和范围,它使得代码更加简洁且易于理解。

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

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

相关文章

一对一WebRTC视频通话系列(六)——部署到公网

本系列博客主要记录一对一WebRTC视频通话实现过程中的一些重点&#xff0c;代码全部进行了注释&#xff0c;便于理解WebRTC整体实现。 本专栏知识点是通过<零声教育>的音视频流媒体高级开发课程进行系统学习&#xff0c;梳理总结后写下文章&#xff0c;对音视频相关内容感…

elasticsearch使用Ngram实现任意位数手机号搜索

文章目录 Ngram自定义分词案例实战问题拆解 Ngram分词器定义Ngram分词定义Ngram分词示例Ngram分词应用场景 Ngram分词实战 Ngram自定义分词案例 当对keyword类型的字段进行高亮查询时&#xff0c;若值为123asd456&#xff0c;查询sd4&#xff0c;则高亮结果是&#xff1c;em&a…

风电功率预测 | 基于遗传算法优化BP神经网络实现风电功率预测(附matlab完整源码)

风电功率预测 风电功率预测 | 基于遗传算法优化BP神经网络实现风电功率预测(附matlab完整源码)完整代码风电功率预测 | 基于遗传算法优化BP神经网络实现风电功率预测(附matlab完整源码) 基于遗传算法优化BP神经网络是一种常见的方法,用于改进BP神经网络在风电功率预测中的性…

AXI UART 16550 IP核简介

AXI UART 16550 IP核实现了PC16550D UART的硬件和软件功能&#xff0c;该UART可以在16450和16550 UART模式下工作。 一、 功能 AXI UART 16550 IP核执行从AXI主设备接收的字符的并行到串行转换&#xff0c;以及从调制解调器或串行外设接收的字符的串行到并行转换。它支持发送…

PLL-分频器

概念 分频器的性能一般用四个参数来规定:(1)分频比&#xff0c;(2)最大允许输入频率fmax&#xff0c;(3)功耗&#xff0c;(4)最小允许输入电压摆幅(也叫“灵敏度”)。虽然分频器的相位噪声也很重要&#xff0c;但在大多数情况下它可以忽略不计。 把一般分频器的输入灵敏度画成…

声纹识别在无人机探测上的应用

无人机在民用和军事领域的应用越来越广泛。然而&#xff0c;随着无人机数量的增加&#xff0c;"黑飞"现象也日益严重&#xff0c;对公共安全和隐私构成了威胁。因此&#xff0c;开发有效的无人机探测与识别技术变得尤为重要。及时发现黑飞无人机的存在进而对其型号进…

Nodejs 第七十章(OSS)

OSS OSS&#xff08;Object Storage Service&#xff09;是一种云存储服务&#xff0c;提供了一种高度可扩展的、安全可靠的对象存储解决方案 OSS 对象存储以对象为基本存储单元&#xff0c;每个对象都有唯一的标识符&#xff08;称为对象键&#xff09;和数据。这些对象可以…

Cesium 3DTileset Style 原理简析

Cesium 3DTileset Style 原理简析 应用层会看到这样的使用。那么原理是什么, 为啥写 height, 除了这个还有啥? const tileset await Cesium.Cesium3DTileset.fromUrl("../../public/tileset/building/tileset.json"); tileset.style new Cesium.Cesium3DTileSty…

【教程向】从零开始创建浏览器插件(三)解决 Chrome 扩展中弹出页面、背景脚本、内容脚本之间通信的问题

第三步&#xff1a;解决 Chrome 扩展中弹出页面、背景脚本、内容脚本之间通信的问题 Chrome 扩展开发中&#xff0c;弹出页面&#xff08;Popup&#xff09;、背景脚本&#xff08;Background Script&#xff09;、内容脚本&#xff08;Content Script&#xff09;各自拥有独立…

牛客网刷题 | BC84 牛牛学数列2

目前主要分为三个专栏&#xff0c;后续还会添加&#xff1a; 专栏如下&#xff1a; C语言刷题解析 C语言系列文章 我的成长经历 感谢阅读&#xff01; 初来乍到&#xff0c;如有错误请指出&#xff0c;感谢&#xff01; 描述 这次牛牛又换了个数…

Dilworth定理:最少的下降序列个数就等于整个序列最长上升子序列的长度

概念如下&#xff1a; 狄尔沃斯定理_百度百科 (baidu.com) 本质就是找要求序列中最长的单调的子序列&#xff08;不一定连续&#xff09;的长度。 模板如下&#xff1a; 时间复杂度为O&#xff08;N^2&#xff09; #include<iostream>using namespace std;int dp[100…

物联网应用开发--STM32与新大陆云平台通信(云平台控制蜂鸣器、LED)

实现目标 1、掌握云平台执行器的创建 2、熟悉STM32 与ESP8266模块之间的通信 3、具体实现目标&#xff1a;&#xff08;1&#xff09;创建5个执行器&#xff1a;蜂鸣器&#xff0c;LED1&#xff0c;LED2&#xff0c;ED3&#xff0c;LED4;&#xff08;2&#xff09;执行器能对…