首页 > 编程语言 >C++20 Ranges简述

C++20 Ranges简述

时间:2023-07-25 10:57:59浏览次数:30  
标签:20 视图 Ranges C++ include 范围

C++20引入了范围(Ranges)的新特性,这是一种现代化的、功能强大的处理序列数据的机制。范围(Ranges)的目标是提供一种更简洁、更易读、更安全且更高效的方式来操作数据序列,代替传统的迭代器和手动循环操作。这里是C++20 Ranges的一些详细解释:

  1. 范围概念: 范围(Ranges)是一种统一的序列表示形式,它可以是一个数组、容器、字符串、文件流等一切能够返回一系列元素的数据源。范围将序列数据和处理数据的算法解耦,使得我们可以在一个范围上链式地应用多个算法,实现流畅且功能强大的数据处理操作。
  2. 范围视图: 范围视图(Ranges Views)是范围的一种扩展,它允许我们在一个范围上进行类似于管道操作的连续转换和筛选操作。范围视图是一种惰性求值的机制,它们并不直接生成数据,而是在需要时根据需要生成数据。
  3. 范围算法: C++20引入了一组新的范围算法,这些算法使用统一的范围接口而不是传统的迭代器。这些算法可以直接作用在范围上,而不需要指定范围的开始和结束迭代器。范围算法提供了丰富的功能,包括排序、查找、变换、筛选、分组等,它们与范围视图一起可以完成大部分序列处理任务。
  4. 范围适配器: 范围适配器(Ranges Adapters)是一种范围视图,用于将范围视图转换为不同类型的范围视图,或者在范围上应用其他操作。范围适配器类似于算法,但它们返回的是一个新的范围视图,而不是处理范围上的元素。
  5. 标准范围库: C++20引入了<ranges>头文件,其中包含了范围概念、范围视图、范围算法和范围适配器的相关类和函数。通过包含这个头文件,您可以在项目中使用C++20 Ranges特性。

使用C++20 Ranges可以大大简化代码,并提高代码的可读性和可维护性。通过使用范围视图和范围算法,我们可以以一种更现代、更简洁的方式处理序列数据,避免了传统迭代器的复杂性和错误风险。然而,为了使用C++20 Ranges,您需要使用支持C++20标准的编译器和标准库。

当使用C++20 Ranges时,可以使用范围视图和范围算法来执行排序、查找、变换、筛选和分组操作。下面是每种操作的代码示例:

  1. 排序(Sort)
#include <algorithm>
#include <ranges>
#include <vector>
#include <iostream>

int main() {
    std::vector<int> numbers = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5};

    // 使用范围视图和范围算法对序列进行排序
    std::ranges::sort(numbers);

    for (const int num : numbers) {
        std::cout << num << ' ';
    }

    return 0;
}
  1. 查找(Find)
#include <algorithm>
#include <ranges>
#include <vector>
#include <iostream>

int main() {
    std::vector<int> numbers = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5};

    // 使用范围视图和范围算法查找序列中的特定值
    auto it = std::ranges::find(numbers, 5);
    if (it != numbers.end()) {
        std::cout << "Found at index: " << std::distance(numbers.begin(), it) << '\n';
    } else {
        std::cout << "Not found\n";
    }

    return 0;
}
  1. 变换(Transform)
#include <algorithm>
#include <ranges>
#include <vector>
#include <iostream>

int main() {
    std::vector<int> numbers = {1, 2, 3, 4, 5};

    // 使用范围视图和范围算法将每个元素平方
    auto squared_numbers = numbers | std::views::transform([](int num) { return num * num; });

    for (const int num : squared_numbers) {
        std::cout << num << ' ';
    }

    return 0;
}
  1. 筛选(Filter)
#include <algorithm>
#include <ranges>
#include <vector>
#include <iostream>

int main() {
    std::vector<int> numbers = {1, 2, 3, 4, 5};

    // 使用范围视图和范围算法筛选出所有偶数
    auto even_numbers = numbers | std::views::filter([](int num) { return num % 2 == 0; });

    for (const int num : even_numbers) {
        std::cout << num << ' ';
    }

    return 0;
}
  1. 分组(Group)
#include <algorithm>
#include <ranges>
#include <vector>
#include <iostream>

int main() {
    std::vector<int> numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

    // 使用范围视图和范围算法将序列分组成奇数和偶数
    auto odd_and_even = numbers | std::views::group_by([](int a, int b) { return (a % 2) == (b % 2); });

    for (auto it = odd_and_even.begin(); it != odd_and_even.end(); ++it) {
        std::cout << "Group: ";
        for (const int num : *it) {
            std::cout << num << ' ';
        }
        std::cout << '\n';
    }

    return 0;
}
  1. 范围适配器(Range Adapters)
#include <algorithm>
#include <ranges>
#include <vector>
#include <iostream>

int main() {
    std::vector<int> numbers = {1, 2, 3, 4, 5};

    // 使用范围视图和范围适配器对序列进行变换和筛选操作
    auto squared_and_even = numbers | std::views::transform([](int num) { return num * num; })
                                    | std::views::filter([](int num) { return num % 2 == 0; });

    for (const int num : squared_and_even) {
        std::cout << num << ' ';
    }

    return 0;
}

以上是C++20 Ranges的一些示例代码,展示了排序、查找、变换、筛选和分组操作的使用。这些范例中,我们使用范围视图和范围算法来处理序列数据,以及使用范围适配器将多个操作链接在一起。这种现代化的处理数据的方式使得代码更加简洁、易读和高效。请确保您的编译器支持C++20标准,以便使用这些特性。

C++20 Ranges 和 C# LINQ (Language-Integrated Query) 都具有类似的目标:简化序列的操作和查询,提高代码的可读性和可维护性。它们都采用了一种声明式的风格,使得开发者能够以更自然的方式处理数据序列。

以下是 C++20 Ranges 和 C# LINQ 之间的一些相似之处:

  1. 链式操作:C++20 Ranges 和 C# LINQ 都支持链式操作,允许开发者以一种流畅的方式在数据序列上应用多个操作。
  2. 惰性求值:C++20 Ranges 和 C# LINQ 都支持惰性求值的范围视图或查询。在需要时,它们会根据需要生成数据,避免不必要的计算。
  3. 标准库集成:C++20 Ranges 是 C++ 标准库的一部分,而 C# LINQ 是 C# 语言的一项集成特性。这使得它们在相应的编程环境中都可以方便地使用。
  4. 功能丰富:C++20 Ranges 和 C# LINQ 都提供了丰富的操作和算法,用于处理数据序列,如筛选、变换、分组、排序、查找等等。
  5. 类型安全:C++20 Ranges 和 C# LINQ 都在设计时考虑了类型安全性,避免了潜在的类型错误。

尽管 C++20 Ranges 和 C# LINQ 有相似之处,但它们之间也有一些区别。例如,C# LINQ 是为 C# 语言和 .NET Framework/.NET 设计的,而 C++20 Ranges 是为 C++ 标准库和编程环境设计的。因此,在使用时需要注意它们的语法和细微差异。

总的来说,C++20 Ranges 和 C# LINQ 都是现代化的数据处理机制,它们使得代码更具表现力,更易读,同时减少了编写循环和迭代器的繁琐。这些特性使得 C++ 和 C# 程序员能够更加方便地处理数据序列,提高开发效率。

标签:20,视图,Ranges,C++,include,范围
From: https://www.cnblogs.com/linxmouse/p/17579183.html

相关文章

  • 2023-06 服务器行业产品趋势
    06-07赛迪顾问《2022-2023年中国服务器市场研究年度报告》发布,数据显示,宝德品牌在中国ARM架构服务器市场销售规模排名第一位 06-22英特尔(Intel)官方宣布,美国能源部阿拉贡国家实验室已经完成基于英特尔CPU及GPU的新一代超算“Aurora”的安装工作,今年晚些时候上线后将提供超过2e......
  • 2023-07 服务器行业产品趋势
    07-13国家网信办联合国家发展改革委、教育部、科技部、工业和信息化部、公安部、广电总局公布《生成式人工智能服务管理暂行办法》(以下称《办法》),自2023年8月15日起施行。其中提到:鼓励生成式人工智能算法、框架、芯片及配套软件平台等基础技术的自主创新;鼓励采用安全可信的芯片、......
  • luogu P3203 [HNOI2010] 弹飞绵羊 题解
    题目传送门:P3203[HNOI2010]弹飞绵羊题意\(n\)个数,满足\(i<a_i≤N+1\),\(m\)次下面两种操作修改一个数\(a_i\)从\(x\)开始跳,\(x=a_x\),几次能够跳出序列\(n\leq2*10^5,m<10^5\)分析数据范围比较大,单纯搜索模拟肯定会T,那么考虑每次让他跳一段就......
  • P1056 [NOIP2008 普及组] 排座椅
    1.变量maxn和g在for循环内声明和初始化,是因为它们用于追踪每次循环中的最大值及其对应的索引。如果将maxn和g的声明移到for循环外部,它们将保留上一次迭代的值,并且比较语句if(a[j]>maxn)或if(b[j]>maxn)将无法正常工作。在每次迭代中将它们初始化为-1的目的......
  • 2023-04 服务器行业产品趋势
    产品趋势概述:1.多样性算力、液冷技术2.国产AI大模型演进3.龙芯3D5000服务器CPU4.华为MetaERP5.以国资央企为代表的行业信创迎重大进展 看政策:生成式AI规范化 具体如下:国际研究机构Gartner®发布全球服务器市场指南《MarketGuideforServers》(以下简称《市场指南》)......
  • 20230724练习总结
    CF627F这个题的题面翻译其实就已经把做法提示得很明显了。每一次操作相当于是把\(0\)移动到相邻的节点上。考虑不加边,那接判断\(0\)移到后是否相同即可。现在要加一条边,可以先把\(0\)移动到位,判断是否相等。可以观察到如果加一条边影响的应该是一个环——顺移一个位置......
  • 办公套件Microsoft Office LTSC 2021最新中文Mac版
    MicrosoftOfficeLTSC2021(office全家桶)中文版是Microsoft为Mac用户推出的一款新iPadMac系列电脑、iPad桌面应用程序。OfficeLTSC2021是MicrosoftOffice系列电脑、iPad电脑和桌面应用程序的新一代操作系统和办公自动化产品。它采用了Mac和Linux操作系统的同步版......
  • 视频编辑重新定义!Premiere Pro 2023 Mac版新增多种功能
    随着AI的不断发展,人工智能的工作方式已经从“人脑”进化到“机器”,而它的最终目标,就是将人类最复杂的工作交给AI。AI也在不断地深入理解人类,提高人类智能。在视频编辑方面,PremierePro2023mac新增了许多功能与以前最大不同之处:它对图片编辑方式进行了重新定义,可以让用户能够......
  • 使用 MyBatis 相关依赖包(20230725)
    开发SpringBoot应用时使用MyBatis的相关依赖包…… 说明:本文首次发布于2023-7-2510点(北京时间),其中的“最新”是这个时间点最新。 0、序章梳理开发SpringBoot项目时,使用各种MyBatis相关依赖包的版本及其关系。 1、SpringBoot2.7.13默认MyBatisFramewo......
  • 触摸屏通过RJ45口无线连接200SMART PLC
    想要实现触摸屏通过RJ45口无线连接200SMARTPLC,需要准备以下几种设备:●西门子PLC型号:S7-200Smart×2台●触摸屏:威纶通TK8071IP×1台●欧美系PLC无线通讯终端:DTD418MB×3块●主从关系:1主2从●通讯接口:RJ45接口然后将这几种设备分别接线。首先是触摸屏与DTD418MB接线,用一......