C++20 范围(Range):简化集合操作

C++20 范围:简化集合操作

  • 一、范围(Range)的目的
  • 二、在模板函数中使用范围概念
  • 三、投影
  • 四、视图
  • 五、结论

一、范围(Range)的目的

在 C++20 中,范围概念要求一个对象同时拥有迭代器和结束哨兵。这在标准集合的上下文中非常有用,特别是在开发针对集合的操作算法(例如模板函数)时。

假设有一个想要排序的值向量:

std::vector<int> values = {10, 20, 15, 35, 5};

可以使用 std::sort() 函数来排序:

std::sort(values.begin(), values.end());

注意,需要传递两个参数,分别是迭代器 values.begin()values.end()。如果能够直接将集合传递给排序函数,那就太好了。

在 C++20 中,std::ranges 命名空间使得这成为可能。因此,可以这样写:

std::ranges::sort(values);

为了实现这一点,ranges::sort() 函数需要使用模板约束,即:

  • 对象拥有一个返回迭代器的 begin() 方法
  • 对象拥有一个返回结束哨兵的 end() 方法

只要满足这两个要求,算法就能正常工作,而实现无需知道实际集合是vectorlist还是其他类型。

这些要求由 std::ranges::range concept形式化,该概念在 C++20 范围库中定义。

二、在模板函数中使用范围概念

如何使用范围概念来开发自己的算法:

#include <ranges>

template <typename T> 
requires std::ranges::range<T>
void mySort(T x)
{
    // 为了演示,我们只是包装了旧的 STL 算法。
    std::sort(x.begin(), x.end());
}

然后,只需用一个参数调用 mySort() 函数:

mySort(values);

三、投影

对对象数组进行排序的问题。以下表示学生考试成绩的类:

class Result
{
public:
    int studentId;
    int score;
};

不能简单地调用 std::ranges::sort(),因为 Result 类没有定义 < 运算符。此外,需要告诉排序函数这里是想按 studentId 还是按 score 排序。

新的 std::ranges 库允许指定一个自定义比较器作为可选的第二个参数,例如:

std::ranges::sort(results,
  [](const Result& x, const Result& y){return x.score < y.score;});

在 C++20 中,可以通过利用 std::ranges::sort() 函数支持投影的事实来进一步简化。这允许指定一个一元函数,用来转换集合中的每个元素:

std::ranges::sort(
  results, 
  std::ranges::less{},
    [](const Result& x){return x.score;});

这里,第三个参数是投影,它将每个 Result 对象转换为其整数 score 值。

需要在第二个参数中提供一个比较器,但由于我们已将元素“投影”到整数,因此可以使用内置的 std::ranges::less 比较器。

更棒的是,由于投影的默认模板类型是 std::ranges::less,可以为第三个参数写 {} 来表示想要使用默认构造函数。因此,代码变为:

std::ranges::sort(
    results, {},
    [](const Result& x){return x.score;});

可以使用“指向成员的指针”语法进一步简化:

std::ranges::sort(results, {},
    &Result::score);

四、视图

视图是范围适配器。因此,可以过滤范围中的元素,或对每个元素应用转换。所有这一切都在不需要分配任何新对象或复制集合的情况下完成。视图的结果本身就是一个范围,因此视图可以链接在一起,或随后传递到范围库中的任何算法。

例如,如果有一个向量 vec,可以删除范围中的第一个元素:

std::views::drop(vec, 1);

可以反转元素:

std::views::reverse(vec);

可以使用管道符号将范围适配器链接在一起:

vec | std::views::reverse | std::views::drop(1);

可以使用过滤器来选择仅包含偶数元素的范围:

vec | std::views::filter(
    [](auto i) { return 0 == i % 2; });

视图的强大之处在于它们允许延迟求值。

五、结论

范围为处理集合提供了急需的功能。它们为语法和可读性带来了重大改进。范围是 C++20 概念实际应用的绝佳示例。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

STM32HAL-最简单的长、短、多击按键框架

目录 概述 一、开发环境 二、STM32CubeMx配置 三、编码 四、运行结果 五、总结 概述 本文章使用最简单的写法实现长、短、多击按键框架&#xff0c;非常适合移植各类型单片机&#xff0c;特别是资源少的芯片上。接下来将在stm32单片机上实现&#xff0c;只需占用1个定时…

定个小目标之每天刷LeetCode热题(7)

今天这道题是道简单题&#xff0c;使用双指针进行迭代即可&#xff0c;画了下草图如下 代码如下 class Solution {public ListNode reverseList(ListNode head) {if (head null || head.next null) {return head;}ListNode p head, q head.next, temp null;while (q ! nu…

电脑缺少dll文件怎么解决,分享几种靠谱的解决方法

在现代科技高度发达的时代&#xff0c;电脑已经成为我们生活和工作中不可或缺的工具。然而&#xff0c;在使用电脑的过程中&#xff0c;我们可能会遇到一些问题&#xff0c;其中之一就是电脑丢失dll文件。那么&#xff0c;当我们面临这样的问题时&#xff0c;应该如何解决呢&am…

全新市场阶段,Partisia BlockChain 将向 RWA、DeFi 等领域布局

Partisia Blockchain 是一个全新范式的 Layer1&#xff0c;该链通过 MPC 方案来构建链上隐私方案&#xff0c;同时该链通过系列独特且创新的设计&#xff0c;旨在进一步解决目前 Web3 中所面临的不可能三角问题&#xff0c;包括安全性、互操作性和可扩展性&#xff0c;为更多的…

Mac安装pytorch(二)

书接上回&#xff0c;配置好了pytorch环境后&#xff0c;看看是否真的能用 终端输入一下代码&#xff1a; import torch xtorch.rand(3,4) print(x) 出现这些后表明安装完成&#xff0c;可使用 接下来在pycharm中使用 打开设置

Django表单革命:打造安全、高效、用户友好的Web应用

Django表单处理&#xff0c;听起来是不是有点枯燥&#xff1f;别急&#xff0c;阿佑将带你领略Django表单的艺术之美。我们将以轻松幽默的语言&#xff0c;一步步引导你从表单的创建到管理&#xff0c;再到验证和自定义&#xff0c;让你在不知不觉中掌握Django表单的精髓。文章…

【工具】探索 DOU:每用户数据使用量

缘分让我们相遇乱世以外 命运却要我们危难中相爱 也许未来遥远在光年之外 我愿守候未知里为你等待 我没想到为了你我能疯狂到 山崩海啸没有你根本不想逃 我的大脑为了你已经疯狂到 脉搏心跳没有你根本不重要 &#x1f3b5; 邓紫棋《光年之外》 什么是 DOU…

cocos creator 3.x 手搓背包拖拽装备

项目背景&#xff1a; 游戏背包 需要手动 拖拽游戏装备到 装备卡槽中&#xff0c;看了下网上资料很少。手搓了一个下午搞定&#xff0c;现在来记录下实现步骤&#xff1b; 功能拆分&#xff1a; 一个完整需求&#xff0c;我们一般会把它拆分成 几个小步骤分别造零件。等都造好了…

C语言笔记第10篇:内存函数

上一篇的字符串函数只是针对字符串的函数&#xff0c;而内存函数是针对内存块的&#xff0c;不在乎内存中存储的数据&#xff01;这就是字符串函数和内存函数的区别。 准备好爆米花&#xff0c;正片开始 1、memcpy的使用和模拟实现 memcpy库函数的功能&#xff1a;任意类型数…

数据结构严蔚敏版精简版-绪论

1.基本概念和术语 下列概念和术语将在以后各章节中多次出现&#xff0c;本节先对这些概念和术语赋予确定的含义。 数据(Data)&#xff1a;数据是客观事物的符号表示&#xff0c;是所有能输入到计算机中并被计算机程序处理的符号 的总称。 数据元素(DataElement)&#xff1a;…

【CC2530-操作外部flash】

zigbee cc2530操作flash&#xff0c;以cc2530读flash_id为例子&#xff1b; void InitIO() {CLKCONCMD & ~0x40; //设置系统时钟源为32MHZ晶振 while(CLKCONSTA & 0x40); //等待晶振稳定为32M CLKCONCMD & ~0x47; //设置系统主时钟频率为32MHZ…

【自动驾驶】针对低速无人车的线控底盘技术

目录 术语定义 一般要求 操纵装置 防护等级 识别代号 技术要求 通过性要求 直线行驶稳定性 环境适应性要求 功能安全要求 信息安全要求 故障处理要求 通信接口 在线升级(OTA) 线控驱动 动力性能 驱动控制响应能力 线控制动 行车制动 制动响应能力 线控转向 总体要求 线控…

防火墙技术基础篇:基于NSP配置L2TP VPN

防火墙技术基础篇&#xff1a;基于eNSP配置L2TP VPN 一、L2TP VPN概念 L2TP&#xff08;Layer 2 Tunneling Protocol&#xff09;&#xff0c;即第二层隧道协议&#xff0c;是一种基于点对点协议&#xff08;PPP&#xff09;的二层隧道协议。它结合了PPTP&#xff08;Point-t…

Docker的安装、启动和配置镜像加速

前言&#xff1a; Docker 分为 CE 和 EE 两大版本。CE 即社区版&#xff08;免费&#xff0c;支持周期 7 个月&#xff09;&#xff0c;EE 即企业版&#xff0c;强调安全&#xff0c;付费使用&#xff0c;支持周期 24 个月。 而企业部署一般都是采用Linux操作系统&#xff0c;而…

Android关闭硬件加速对PorterDuffXfermode的影响

Android关闭硬件加速对PorterDuffXfermode的影响 跑的版本minSdk33 编译SDK34 import android.content.Context import android.graphics.Bitmap import android.graphics.Canvas import android.graphics.Color import android.graphics.Paint import android.graphics.Port…

Nginx企业级负载均衡:技术详解系列(16)—— Nginx的try_files指令,你知道这个指令是干什么的吗?

你好&#xff0c;我是赵兴晨&#xff0c;97年文科程序员。 今天咱们来聊一聊Nginx的try_files指令&#xff0c;你知道这个指令是干什么的吗&#xff1f; 如果你对Web服务器配置有所了解&#xff0c;那么你可能会对try_files指令感到好奇。这个指令实际上是Nginx配置中的一项强…

专业渗透测试 Phpsploit-Framework(PSF)框架软件小白入门教程(十四)

本系列课程&#xff0c;将重点讲解Phpsploit-Framework框架软件的基础使用&#xff01; 本文章仅提供学习&#xff0c;切勿将其用于不法手段&#xff01; 接上一篇文章内容&#xff0c;讲述如何进行Phpsploit-Framework软件的基础使用和二次开发。 今天&#xff0c;我们来介…

19.4-STM32接收数据-状态显示在屏幕 openMV寻迹与小车控制 Openmv+STM32F103C8T6视觉巡线小车

这个是全网最详细的STM32项目教学视频。 第一篇在这里: 视频在这里 STM32智能小车V3-STM32入门教程-openmv与STM32循迹小车-stm32f103c8t6-电赛 嵌入式学习 PID控制算法 编码器电机 跟随 19.4-STM32接收数据-状态显示在屏幕 先通过串口上位机模拟发送、 STM32有视觉循迹模式、…

SwiftUI知识点(一)

前言&#xff1a; Swift知识点&#xff0c;大至看完了&#xff0c;公司项目是Swift语言写的&#xff0c;后续苹果新出的SwiftUI&#xff0c;也需要学习一下 不知觉间&#xff0c;SwiftUI是19年出的&#xff0c;现在24年&#xff0c;5年前的东西了 学习的几个原因&#xff1a; …

探索DIYGW可视化开发工具:提升UniApp项目效率与质量的新途径

一、引言 在快速迭代和不断创新的移动应用开发领域中&#xff0c;开发者们常常面临着一个共同的挑战&#xff1a;如何在保证开发质量的同时&#xff0c;缩短开发周期。近期&#xff0c;一款名为DIYGW的可视化开发工具进入了我们的视野&#xff0c;它以其独特的拖拽式开发方式和…