当前位置: 首页 > news >正文

「C/C++」C++20 之 #include<ranges> 范围

在这里插入图片描述

✨博客主页
何曾参静谧的博客
📌文章专栏
「C/C++」C/C++程序设计
📚全部专栏
「VS」Visual Studio「C/C++」C/C++程序设计「UG/NX」BlockUI集合
「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发
「QT」QT5程序设计「File」数据文件格式「PK」Parasolid函数说明

目录

      • 一、背景和目的
      • 二、主要组件
      • 三、关键概念
      • 四、使用示例
      • 五、总结

C++20中的<ranges>是C++标准库的一个新特性,它引入了一系列与范围(Ranges)相关的功能和概念,旨在提供一种更现代、高效和表现力强的方式来处理序列数据。以下是对C++20中<ranges>的详细介绍:

一、背景和目的

在C++20之前,处理序列数据通常依赖于迭代器和手动循环操作,这不仅使代码变得复杂,还容易出错。<ranges>的引入旨在解决这些问题,提供一种更简洁、更易读、更安全且更高效的方式来操作数据序列。

二、主要组件

  1. 范围(Ranges)

    • 范围是一种统一的序列表示形式,它可以是一个数组、容器(如std::vectorstd::list等)、字符串、文件流等一切能够返回一系列元素的数据源。
    • 范围通过定义一系列标准要求,规定了怎样的对象可被视为一个范围。这些标准包括提供开始迭代器和结束标记等。
  2. 视图(Views)

    • 视图是范围的一种特殊形式,它提供了一种对数据的“视图”,而不实际拥有数据。
    • 视图是惰性求值的,即操作直到真正需要结果时才会执行,这有助于提升效率。
    • C++20提供了多种内置视图,如std::views::filter(过滤)、std::views::transform(变换)、std::views::take(取前N个元素)、std::views::drop(跳过前N个元素)等。
  3. 范围友好算法(Range-Algorithms)

    • 对传统STL库的算法进行了升级和扩展,使其可以直接作用于范围对象,并能充分利用视图的特性。
    • 范围算法提供了丰富的功能,包括排序、查找、变换、筛选、分组等。
  4. 辅助工具

    • 一些工具函数,使得对范围的操作更为便捷。

三、关键概念

  1. 范围概念(Range Concept)

    • 范围概念是C++20中引入的一个核心特性,它描述了一组行为特征,而不用关心具体的类型。
    • 符合范围概念的对象都可以被当作范围对象来处理。
  2. 借用范围(Borrowed Range)

    • 借用范围是指不会因为迭代而被消耗的数据序列,例如引用原始数据的视图或者引用类型的容器。
    • 借用范围生命周期结束后,其迭代器仍然有效。

四、使用示例

以下是一些使用<ranges>的示例代码:

  1. 基本范围操作
#include <vector>
#include <ranges>
#include <iostream>int main() {std::vector<int> numbers = {1, 2, 3, 4, 5};// 使用范围for循环for (int n : numbers) {std::cout << n << " ";}std::cout << std::endl;return 0;
}
  1. 使用视图过滤和变换
#include <vector>
#include <ranges>
#include <iostream>int main() {std::vector<int> numbers = {1, 2, 3, 4, 5};// 使用视图过滤偶数auto even_numbers = numbers | std::views::filter([](int n) { return n % 2 == 0; });// 使用视图变换auto squared_numbers = even_numbers | std::views::transform([](int n) { return n * n; });for (int n : squared_numbers) {std::cout << n << " "; // 输出: 4 16}std::cout << std::endl;return 0;
}
  1. 使用范围算法排序和查找
#include <vector>
#include <ranges>
#include <algorithm>
#include <iostream>int main() {std::vector<int> numbers = {5, 3, 1, 4, 2};// 使用范围算法排序std::ranges::sort(numbers);// 使用范围算法查找auto it = std::ranges::find(numbers, 3);if (it != numbers.end()) {std::cout << "Found: " << *it << std::endl; // 输出: Found: 3}return 0;
}

五、总结

C++20中的<ranges>通过引入范围和视图的概念,不仅丰富了STL的功能,还引领了更现代、高效、表现力强的编程实践。它鼓励开发者采用更函数式和声明式的编程风格,同时保持了与传统STL的兼容。随着C++20的广泛应用,<ranges>将成为现代C++编程的重要工具。


在这里插入图片描述


http://www.mrgr.cn/news/61667.html

相关文章:

  • C语言中的位操作
  • vue3+vite5 打包优化
  • 【C#/C++】C++使用托管式的导出dll的方式给C#调用
  • 如何在Django中使用模板
  • 部署合约 truffle migrate
  • MPL助力固态前驱体光刻胶,图案化金属氧化物半导体更精密
  • 摩尔定律:引领计算机技术发展的神奇力量
  • HTML入门教程23:HTML脚本
  • 【含文档】基于ssm+jsp的高考志愿辅助填报系统(含源码+数据库+lw)
  • springboot响应文件流文件给浏览器+前端下载
  • Windows Terminal终端美化
  • CSDN粉丝服务功能
  • 钣金结构的防水设计简介
  • redis:基本全局命令-键管理(1)
  • 【2023工业图像异常检测文献】DiAD: 基于扩散模型的多类异常检测方法
  • CMake 同时编译两个程序
  • CentOS下Redis简洁安装(无坑版)
  • 【C++题解】1186. 数字走向III
  • Kafka 物理存储机制
  • 浏览器HTTP缓存解读(HTTP Status:200 304)
  • 大东方码险引领彩票行业新纪元:全球保险巨头携手共创新篇章
  • 【Python】元组、字典与集合详解:数据容器的实战应用
  • 【STM32 Blue Pill编程实例】-4位7段数码管使用
  • 干货:零基础Google免费的GPU Colab+手把手理解扩散模型
  • 火语言RPA流程组件介绍--鼠标长按
  • 关于我的数据结构与算法——初阶第二篇(排序)