C++系列十:日常学习-范围库Ranges

这篇具有很好参考价值的文章主要介绍了C++系列十:日常学习-范围库Ranges。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录
  • 前言
  • 介绍
  • 举例:

前言

不错麽

内容参考

  1. https://zh.cppreference.com/w/cpp/ranges
  2. Chatjpt

总结注意点:

  1. 确保你的C++编译器支持C++20标准
  2. 包含 ranges 头文件
  3. views的操作是惰性的,它们不会立即执行,而是在需要时计算。这意味着你可以构建复杂的管道,而不必担心性能问题。提供性能优势,因为它们避免了不必要的数据拷贝和临时存储。在处理大型数据集时,这种优化尤为重要。
  4. 使用views不会修改原始数据,它们只是提供了对数据的查看和操作方式。因此,原始数据保持不变,不会被修改。
  5. 要小心处理可能的异常情况,例如范围越界或无效的操作。可以使用try-catch块来处理异常。
  6. 管道操作符 |(竖线符号)=>数据处理操作可以从左到右依次执行,

介绍

C++20引入了Ranges库,其中的views是该库的一个关键组成部分。views提供了一种现代化的、功能强大的方法来处理数据序列,它基于"range-based"编程范式,允许你以声明性的方式对数据序列进行操作,而无需手动编写循环。以下是关于views的详细介绍:

  1. 什么是views

    views是C++20中Ranges库的一部分,它代表了一个数据序列的虚拟视图。这个视图允许你以一种便捷和现代的方式访问和操作数据,同时不需要实际地拷贝或修改原始数据。views的操作是惰性的,只有在需要的时候才会执行。

  2. 视图的创建:

    你可以通过调用标准容器的views成员函数或使用适配器来创建视图。例如,可以使用std::vector创建一个视图:

    std::vector<int> numbers = {1, 2, 3, 4, 5};
    auto view = numbers | std::views::transform([](int x) { return x * 2; });
    

    在这里,std::views::transform是一个视图适配器,它将一个函数应用于容器中的每个元素,创建一个新的视图。

  3. 视图的操作:

    一旦创建了视图,你可以对其执行各种操作,这些操作包括但不限于:

    • 筛选(filtering):筛选出满足特定条件的元素。

    • 映射(mapping):将函数应用于序列中的每个元素。

    • 切片(slicing):选择范围内的元素。

    • 排序(sorting):对元素进行排序。

    你可以将多个操作组合在一起来创建复杂的数据处理管道,而这些操作都是惰性执行的。

  4. 遍历视图:

    一旦创建了视图,你可以使用for循环或范围for循环来遍历它。视图会在遍历时动态计算元素,而不会一次性生成所有元素。

    for (int num : view) {       std::cout << num << " ";   }
    
  5. 性能优势:

    views具有优化的性能。它们避免了不必要的数据拷贝和临时存储,使得在处理大型数据集时非常高效。

  6. 自定义视图:

    你还可以创建自定义的视图,通过实现必要的迭代器和操作符来定义你自己的数据序列操作。

  7. views的应用场景:

    views适用于各种应用场景,包括数据转换、筛选、数据流处理、映射、集合操作等。它们可以使你的代码更加清晰、可读和高效。

总之,views是C++20引入的一个重要特性,它使得序列处理变得更加简单和现代化。它们提供了一种优雅的方式来处理数据序列,避免了繁琐的手动迭代和数据操作。在使用时,请确保你的编译器支持C++20标准并了解如何正确使用Ranges库以发挥其强大的功能。文章来源地址https://www.toymoban.com/news/detail-710535.html

举例:

std::vector<int> numbers = {1, 2, 3, 4, 5};
// 使用views::transform将每个元素翻倍=>2 4 6 8 10
auto doubled = numbers | std::views::transform([](int x) { return x * 2; });
// 使用views::filter筛选偶数 =>2 4
auto evenNumbers = numbers | std::views::filter([](int x) { return x % 2 == 0; });
// 使用views::slice选择范围[1, 3)=> 2 3 4
auto slicedRange = numbers | std::views::slice(1, 4);
// 链式操作:筛选偶数,然后翻倍=>4 8
auto result = numbers | std::views::filter([](int x) { return x % 2 == 0; })
                      | std::views::transform([](int x) { return x * 2; });
// 使用views::iota生成范围[1, 10)=>1~9
auto sequence = std::views::iota(1, 10);
// 生成无限递增序列~~~
auto infiniteSequence = std::views::iota(1);   
// 使用views::reverse反向迭代容器=>5 4 3 2 1
auto reversed = numbers | std::views::reverse;    
// 使用views::concat合并两个容器
std::vector<int> numbers1 = {1, 2, 3};
std::vector<int> numbers2 = {4, 5, 6};
auto combined = std::views::concat(numbers1, numbers2);
for (int num : doubled) {
  std::cout << num << " "; 
//拆分字符串
std::string text = "Hello,World,C++,Ranges";
auto splitView = text | std::views::split(',');
for (const auto& range : splitView) {
    std::string token(range.begin(), range.end());
    std::cout << token << std::endl;
} 

//对比:
auto const ints = {0,1,2,3,4,5};
auto even = [](int i) { return 0 == i % 2; };
auto square = [](int i) { return i * i; };
// 组合视图的“管道”语法:
for (int i : ints | std::views::filter(even) | std::views::transform(square)) {
    std::cout << i << ' ';
}
std::cout << '\n';
// 传统的“函数式”组合语法:
for (int i : std::views::transform(std::views::filter(ints, even), square)) {
    std::cout << i << ' ';
}


还有许多适配器就不一一举例说明了。
高深的就不探究了,会使用好工具就得了。

到了这里,关于C++系列十:日常学习-范围库Ranges的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • FPGA学习实践之旅——前言及目录

    很早就有在博客中记录技术细节,分享一些自己体会的想法,拖着拖着也就到了现在。毕业至今已经半年有余,随着项目越来越深入,感觉可以慢慢进行总结工作了。趁着2024伊始,就先开个头吧,这篇博客暂时作为汇总篇,记录在这几个月以及之后从FPGA初学者到也算有一定

    2024年02月03日
    浏览(58)
  • 【C++】C++学习前言

    C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的程序,需要高度的抽象和建模时,C语言则不合适。为了解决软件危机, 20世纪80年代, 计算机界提出了OOP(objectoriented programming:面向对象)思想,支持面向对象的程序设计语言应运而生。

    2024年03月12日
    浏览(56)
  • 【自制C++深度学习框架】前言

    此GitHub项目是一个初学者的深度学习框架,使用C++编写,旨在为用户提供一种简单、易于理解的深度学习实现方式。以下是本项目的主要特点和功能: 计算图:使用计算图来描述深度学习模型的计算过程,利用计算图将神经网络的计算过程视为一个有向无环图。通过构建计算

    2024年02月07日
    浏览(43)
  • 【C++初阶(一)】学习前言以及命名空间

    💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:C++初阶之路⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学习排序知识   🔝🔝 对于复杂的问题,规模较大的程序 需要高度的抽象和建模时 C语言不再适合应用于这种场景 于是在1982年 C++创始人 Bjarne Stroustrup 在C语言

    2024年02月11日
    浏览(53)
  • 【C++初阶】前言——C++的发展简述及学习方法分享

     ========================================================================= 主页点击直达: 个人主页 我的小仓库: 代码仓库 C语言偷着笑: C语言专栏 数据结构挨打小记: 初阶数据结构专栏 Linux被操作记: Linux专栏 LeetCode刷题掉发记: LeetCode刷题 算法: 算法专栏  C++头疼记: C++专栏 ====

    2024年02月08日
    浏览(63)
  • 【C++初阶(一)】学习前言 命名空间与IO流

    本专栏内容为:C++学习专栏,分为初阶和进阶两部分。 通过本专栏的深入学习,你可以了解并掌握C++。 💓博主csdn个人主页:小小unicorn ⏩专栏分类:C++ 🚚代码仓库:小小unicorn的代码仓库🚚 🌹🌹🌹关注我带你学习编程知识 C++是基于C语言而产生的,它既可以进行C语言的

    2024年02月08日
    浏览(97)
  • 《Git入门实践教程》前言+目录

    版本控制系统(VCS)在项目开发中异常重要,但和在校大学生的交流中知道,这个重要方向并未受到重视。具备这一技能,既是项目开发能力的体现,也可为各种面试加码。在学习体验后知道,Git多样化平台、多种操作方式、丰富的资源为业内人士提供了方便的同时,也造成

    2024年02月10日
    浏览(72)
  • Jmeter系列-环境部署、详细介绍、安装目录介绍(1)

    http://jmeter.apache.org/下载最新版本的 JMeter,解压文件到任意目录 1、下载(注意选择操作系统对应的位数32/64) 官网 :http://www.oracle.com 2、安装(一键式) ,所有步骤选择项默认选择项。 3、配置环境变量 JAVA_HOME=JDK完整安装路径 环境变量Path添加:%JAVA_HOME%bin;%JAVA_HOME%jrebin;

    2024年02月09日
    浏览(44)
  • RK3568平台开发系列讲解(Linux系统篇)Linux 目录结构介绍

    🚀返回专栏总目录 沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇我们从目录管理入手,会更直观的理解 linux 的目录结构。 Linux 整个文件系统是以“ / ”目录开始,根目录是最顶层,前面讲根目录和家目录概念的时候已经提到了。它下边包括众多的目录,这些

    2023年04月13日
    浏览(62)
  • C/C++系列系统学习目录

    友情链接:专栏地址 编程规范:C/C++语言编程规范 章节 内容 1.初识C语言 【C语言篇】初识C语言 2.C语言最基础入门 【C语言篇】C语言最基础入门 3.C语言的输入输出相关知识 【C语言篇】C语言的输入/输出相关知识 4.C语言的if选择结构和循环结构 【C语言篇】C语言的if选择结构

    2024年02月12日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包