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

news/2025/3/4 21:49:22/

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.ppmy.cn/news/1576652.html

相关文章

汽车轮胎损伤缺陷分割数据集labelme格式1957张3类别

数据集格式&#xff1a;labelme格式(不包含mask文件&#xff0c;仅仅包含jpg图片和对应的json文件) 图片数量(jpg文件个数)&#xff1a;1957 标注数量(json文件个数)&#xff1a;1957 标注类别数&#xff1a;3 标注类别名称:["cut","indentation",&quo…

NO.22十六届蓝桥杯备战|一维数组|七道练习|冒泡排序(C++)

B2093 查找特定的值 - 洛谷 题⽬要求下标是从0开始的&#xff0c;和数组的下标是吻合的&#xff0c;存放数据应该从下标0开始n的取值范围是1~10000数组中存放的值的绝对值不超10000&#xff0c;说明int类型就⾜够了找到了输出下标&#xff0c;找不到要输出-1&#xff0c;这⼀点…

Java面试第八山!《Spring框架》

一、Spring框架概述 Spring是Java企业级应用开发的核心框架&#xff0c;通过控制反转&#xff08;IoC&#xff09;和 面向切面编程&#xff08;AOP&#xff09;实现模块解耦&#xff0c;简化开发流程。其核心优势包括依赖注入、声明式事务管理、集成主流ORM框架&#xff08;如…

初阶数据结构(C语言实现)——3顺序表和链表(1)

目录 【本节目标】1. 线性表2.顺序表2.1概念及结构2.2 接口实现2.2.0 动态顺序表2.2.1 顺序表初始化SLInit&#xff08;&#xff09;2.2.2 销毁和打印2.2.3 尾插SLPushBack&#xff08;&#xff09;2.2.4 尾删SLPopBack&#xff08;&#xff09;2.2.5 头插2.2.6 头删2.2.7 插入…

Spring学习笔记03——Spring Boot的文件结构

Spring boot常见的文件结构&#xff1a; src/ ├── main/ │ ├── java/ │ │ └── com.example.demo/ │ │ ├── DemoApplication.java # 主入口 │ │ ├── config/ # 配置类 │ │ ├── controller/ …

MySQL实现文档全文搜索,分词匹配多段落重排展示,知识库搜索原理分享

一、背景 在文档搜索场景中&#xff0c;高效精准的搜索功能至关重要&#xff0c;能提升检索效率&#xff0c;为用户提供精准、快速的信息获取体验&#xff0c;提高工作效率。在文档管理系统里&#xff0c;全文搜索是非常重要的功能之一。随着文档数量增长&#xff0c;如何快速…

C++运算符重载的学习笔记

加号运算符重载 两种方式 成员函数重载加号 #include <iostream> using namespace std; //加号运算符重载 class Person { public: // 1.成员函数重载加号 Person operator(Person&p) { Person tmp; tmp.m_A this->m_A p.m_A; tmp.m_B …

【前端基础】2、HTML的元素(基础说明)

一、元素概述 HTML本质是元素组成。 元素是网页的一部分。一个元素可以包含一个数据项&#xff0c;或者一块文本&#xff0c;或者一个图片&#xff0c;或者什么都不包含。 二、元素的组成 开始标签&#xff0c;结束标签&#xff0c;内容&#xff0c;组成一个完整元素。 三…