c++ Ranges Library使用笔记(简单说明)

c++ Ranges Library使用笔记(简单说明)

    • 1. 数值适配器(Range Adapters)
      • 常用数值适配器
      • 示例代码
    • 2. 生成器(Generators)
      • 常用生成器
      • 示例代码
    • 3. 组合使用示例
      • 示例代码
    • 总结
      • 数值适配器(Range Adapters)
      • 生成器(Generators)
      • 组合使用

C++20 引入了 范围库(Ranges Library),其中包括 数值适配器(Range Adapters)生成器(Generators)。这些工具可以简化对区间的操作,并支持链式调用和惰性求值。

以下是数值适配器和生成器的简单说明及示例:


1. 数值适配器(Range Adapters)

数值适配器用于对输入区间进行变换、过滤等操作,返回一个新的视图(View)。视图是惰性的,只有在需要时才会计算。

常用数值适配器

  • std::views::transform: 对区间中的每个元素进行变换。
  • std::views::filter: 过滤区间中满足条件的元素。
  • std::views::take: 取区间中的前 N 个元素。
  • std::views::drop: 跳过区间中的前 N 个元素。
  • std::views::reverse: 反转区间。

示例代码

#include <iostream>
#include <ranges>
#include <vector>int main() {std::vector<int> numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};// 使用 transform 将每个元素乘以 2auto doubled = numbers | std::views::transform([](int n) { return n * 2; });for (int n : doubled) {std::cout << n << " "; // 输出: 2 4 6 8 10 12 14 16 18 20}std::cout << std::endl;// 使用 filter 过滤偶数auto evens = numbers | std::views::filter([](int n) { return n % 2 == 0; });for (int n : evens) {std::cout << n << " "; // 输出: 2 4 6 8 10}std::cout << std::endl;// 使用 take 取前 5 个元素auto first_five = numbers | std::views::take(5);for (int n : first_five) {std::cout << n << " "; // 输出: 1 2 3 4 5}std::cout << std::endl;// 组合使用:过滤偶数,取前 3 个,然后乘以 2auto combined = numbers | std::views::filter([](int n) { return n % 2 == 0; })| std::views::take(3)| std::views::transform([](int n) { return n * 2; });for (int n : combined) {std::cout << n << " "; // 输出: 4 8 12}std::cout << std::endl;return 0;
}

2. 生成器(Generators)

生成器用于在运行时生成数值序列,可以是有限的或无限的。

常用生成器

  • std::views::iota: 生成一个递增的数值序列。

示例代码

#include <iostream>
#include <ranges>int main() {// 生成从 1 开始的无限序列auto infinite_seq = std::views::iota(1);// 取前 10 个元素for (int n : infinite_seq | std::views::take(10)) {std::cout << n << " "; // 输出: 1 2 3 4 5 6 7 8 9 10}std::cout << std::endl;// 生成从 10 到 19 的有限序列auto finite_seq = std::views::iota(10, 20);for (int n : finite_seq) {std::cout << n << " "; // 输出: 10 11 12 13 14 15 16 17 18 19}std::cout << std::endl;return 0;
}

3. 组合使用示例

数值适配器和生成器可以组合使用,实现复杂的逻辑。

示例代码

#include <iostream>
#include <ranges>int main() {// 生成从 1 开始的无限序列auto seq = std::views::iota(1);// 过滤偶数,取前 5 个,然后乘以 3auto result = seq | std::views::filter([](int n) { return n % 2 == 0; })| std::views::take(5)| std::views::transform([](int n) { return n * 3; });for (int n : result) {std::cout << n << " "; // 输出: 6 12 18 24 30}std::cout << std::endl;return 0;
}

总结

数值适配器(Range Adapters)

  • 功能:对区间进行变换、过滤、截取等操作。
  • 特点:惰性求值,支持链式调用。
  • 常用适配器
    • transform:变换元素。
    • filter:过滤元素。
    • take:取前 N 个元素。
    • drop:跳过前 N 个元素。
    • reverse:反转区间。

生成器(Generators)

  • 功能:生成数值序列。
  • 特点:可以是无限的或有限的。
  • 常用生成器
    • iota:生成递增序列。

组合使用

  • 数值适配器和生成器可以组合使用,实现复杂的逻辑。
  • 示例:
    auto result = std::views::iota(1)| std::views::filter([](int n) { return n % 2 == 0; })| std::views::take(5)| std::views::transform([](int n) { return n * 3; });
    

通过使用数值适配器和生成器,可以编写更简洁、高效的代码,同时充分利用 C++20 的范围库特性。

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

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

相关文章

Linux-计算机网络.udp

1.收发函数: read&#xff08;&#xff09;/write () ///通用文件读写&#xff0c;可以操作套接字。 recv(,0) /send(,0) ///TCP 常用套机字读写 recvfrom()/sendto() ///UDP 常用套接字读写 ssize_t recv(int sockfd, void *buf, size_t len, …

如何安装VM虚拟机

安装 VMware 附官方下载链接&#xff08;VM 17 pro&#xff09;&#xff1a;https://download3.vmware.com/software/WKST-1701-WIN/VMware-workstation-full-17.0.1-21139696.exe 打开下载好的VMware Workstation 17 Pro安装包&#xff1b; 点击下一步&#xff1b; 勾选我接…

js的简单介绍

一.javascript&#xff08;是什么&#xff09; 是一种运行在客户端(浏览器)的编程语言&#xff0c;实现人机交互效果 作用 网页特效&#xff08;监听客户的一些行为让网页做出对应的反馈&#xff09;表单验证(针对表格数据的合法性进行判断)数据交互(获取后台的数据&#xf…

绕过 RAG 实时检索瓶颈,缓存增强生成(CAG)如何助力性能突破?

编者按&#xff1a; 你是否曾经遇到过这样的困扰&#xff1a;在开发基于 RAG 的应用时&#xff0c;实时检索的延迟让用户体验大打折扣&#xff1f;或者在处理复杂查询时&#xff0c;检索结果的不准确导致回答质量不尽如人意&#xff1f; 在当前大语言模型应用大规模落地的背景下…

【Java SE】面向对象编程(基础)

面向对象编程&#xff08;基础&#xff09; 目录 1.类与对象的关系 2.对象在内存中的存在形式 2.2 注意事项&#xff08;1&#xff09; 2.3 注意事项&#xff08;2&#xff09; 3.对象的创建方式 4.变量 4.1 成员变量 4.1.1 语法格式 4.1.2 说明 4.2 局部变量 4.2.1…

excel 斜向拆分单元格

右键-合并单元格 右键-设置单元格格式-边框 在设置好分割线后&#xff0c;你可以开始输入文字。 需要注意的是&#xff0c;文字并不会自动分成上下两行。 为了达到你期望的效果&#xff0c;你可以通过 同过左对齐、上对齐 空格键或使用【AltEnter】组合键来调整单元格中内容的…

LeetCode 21. 合并两个有序链表(Python)

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4] 示例 2&#xff1a; 输入&#xff1a;l1 [], l2 [] 输出&#xff1a;[] 示例 3&#xff1a; 输…

Linux下安装VS Code

Centos 7 https://blog.csdn.net/weixin_63790642/article/details/132927888 安装存储库 sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc密钥 sudo sh -c echo -e "[code]\nnameVisual Studio Code\nbaseurlhttps://packages.microsoft.com/yum…

【软考-架构】2.1、操作系统概述-进程管理-同步互斥

✨资料&文章更新✨ GitHub地址&#xff1a;https://github.com/tyronczt/system_architect 文章目录 操作系统知识操作系统概述进程组成和状态&#x1f4af;考试真题前趋图进程资源图&#x1f4af;考试真题问题1问题2 ✨【重点】进程同步与互斥✨&#x1f4af;考试真题问题…

养老小程序方案详解居家养老小程序系统

养老小程序&#xff0c;上门居家养老小程序&#xff0c;用户端护工端小程序&#xff0c;管理后台。php开发语言&#xff0c;可源码搭建&#xff0c;二次开发或者定制开发。 一 用户端&#xff1a;小程序 核心功能模块&#xff1a;用户完善个人健康档案&#xff0c;在线选择服…

基于NI USRP 硬件的下一代O-RAN研究测试台​

目录 基于NI SDR硬件的下一代O-RAN研究测试台​挑战&#xff1a;解决方案&#xff1a; 基于NI SDR硬件的下一代O-RAN研究测试台​ “OAIC提供了一个开放平台&#xff08;包括软件架构、库和工具集&#xff09;&#xff0c;用于对基于AI的无线接入网(RAN)控制器进行原型开发和测…

磁盘空间不足|如何安全清理以释放磁盘空间(开源+节流)

背景&#xff1a; 最近往数据库里存的东西有点多&#xff0c;磁盘不够用 查看磁盘使用情况 df -h /dev/sda5&#xff08;根目录 /&#xff09; 已使用 92% 咱们来开源节流 目录 背景&#xff1a; 一、开源 二、节流 1.查找 大于 500MB 的文件&#xff1a; 1. Snap 缓存…

WP 高级摘要插件:助力 WordPress 文章摘要精准自定义显示

wordpress插件介绍 “WP高级摘要插件”功能丰富&#xff0c;它允许用户在WordPress后台自定义文章摘要。 可设置摘要长度&#xff0c;灵活调整展示字数&#xff1b;设定摘要最后的显示字符&#xff0c; 如常用的省略号等以提示内容未完整展示&#xff1b;指定允许在摘要中显示…

健康医疗大数据——医疗影像

一、 项目概述 1.1 项目概述 1.2 项目框架 1.3 项目环境 1.4 项目需求 二、项目调试与运行 2.1需求分析 2.2具体实现 三、项目总结 项目概述 项目概述 本项目旨在应用大数据技术于医疗影像领域&#xff0c;通过实训培养团队成员对医疗大数据处理和分析的实际…

C# OnnxRuntime部署DAMO-YOLO人头检测

目录 说明 效果 模型信息 项目 代码 下载 参考 说明 效果 模型信息 Model Properties ------------------------- --------------------------------------------------------------- Inputs ------------------------- name&#xff1a;input tensor&#xff1a;Floa…

VPC2-多域攻击-tomcat渗透-通达oa-域控提权-密码喷射-委派攻击-数据库提权

下载链接: https://pan.baidu.com/s/1nUYj6G9ouj6BcumDgoDaGg 提取码: ejbn jishu域 windows 2008 tomcat渗透 访问发现tomcat 点击manage app 尝试弱口令进入,发现tomcat/tomcat成功进入 用哥斯拉生成后门 然后建立一个文件夹&#xff0c;把它放进去&#xff0c;把它改名…

Linux知识-第一天

Linux的目录机构为一个树型结构 其没有盘符这个概念&#xff0c;只有一个根目录&#xff0c;所有文件均在其之下 在Linux系统中&#xff0c;路径之间的层级关系 使用 / 开头表示根目录&#xff0c;后面的表示层级关系 Linux命令入门 Linux命令基础 Linux命令通用格式 comman…

【蓝桥杯单片机】第十二届省赛

一、真题 二、模块构建 1.编写初始化函数(init.c) void Cls_Peripheral(void); 关闭led led对应的锁存器由Y4C控制关闭蜂鸣器和继电器 由Y5C控制 2.编写LED函数&#xff08;led.c&#xff09; void Led_Disp(unsigned char ucLed); 将ucLed取反的值赋给P0 开启锁存器…

FPGA开发,使用Deepseek V3还是R1(7):以“FPGA的整体设计框架”为例

以下都是Deepseek生成的答案 FPGA开发&#xff0c;使用Deepseek V3还是R1&#xff08;1&#xff09;&#xff1a;应用场景 FPGA开发&#xff0c;使用Deepseek V3还是R1&#xff08;2&#xff09;&#xff1a;V3和R1的区别 FPGA开发&#xff0c;使用Deepseek V3还是R1&#x…

Linux进程状态

一.基础知识 在进入到Linux进程状态学习之前&#xff0c;我们先学习一些基础知识&#xff1a; 1.1并发和并行 并发&#xff1a; 在单CPU的计算机中&#xff0c;并不是把当前进程执行完毕之后再执行下一个&#xff0c;而是给每个进程都分配一个时间片&#xff0c;基于时间片进…