c++20 ranges库

2023-05-16

ranges库在对元素进行逐一操作或者判断时可以省掉很多循环体,使代码的可读性提高。

例如,要从一个vector中拿出所有的偶数并求平方并逆序排列,生成一个新的vector,以前这样写:

vector<int> v1 = {0, 1, 2, 3, 4};
vector<int> v2;
for (auto i : v1) {
    if (i % 2 == 0) {
        v2.push_back(i * i);
    }
}
vector<int> v3(v2.rbegin(), v2.rend());

有了ranges后就可以用管道符(|)的形式写,对数据先后做了怎样的操作一目了然。

for (int i : v1 | views::filter([](int i) { return i % 2 == 0; })
                | views::transform([](int i) { return i * i; })
                | views::reverse) {
    printf("%d ", i);
}

下面我们了解一下这个库

首先是range的概念,它是一个concepts,定义如下:

即任何类型,只要它有首尾迭代器,它就是个range。我们常用的STL、数组、string,都是range。

然后是view(视图)的概念,它是指一段元素从某个“视角”看过去的样子,在这个视图中的真实值都是惰性求值的,拿上面这个例子来说,看似我们对一段range进行了逐元素求平方的操作,实际上这个操作是在遍历过程中计算的,并不是在生成这个view对象时计算的。因此view只是一个壳子,它不具有元素真正的内存空间,可以进行任意拷贝。

下面介绍几种range adapter,它用来对一段range或view生成另一个view

1. filter view,对一段view进行过滤,筛选出符合条件的元素

vector<int> vec{0, 1, 2, 3, 4};  // 用vector作为一个range
auto even = [](int i) { return i % 2 == 0; };  // 过滤出其中的所有偶数
for (int i : vec | views::filter(even)) {  // 管道符形式
    printf("%d ", i);
}
for (int i : views::filter(vec, even)) {  // 函数形式
    printf("%d ", i);
}
for (int i : ranges::filter_view(vec, even)) {  // 函数形式
    printf("%d ", i);
}

auto v = vec | views::filter(even);
vector<int> b(v.begin(), v.end());  // 用view的迭代器来构造一个新的vector

2. transform view,对一段view进行逐元素的变换

string str{"Hello"};  // 用string作为一个range
auto to_upper = [](char c) { return toupper(c); };  // 将每个元素都转为大写
for (char c : str | views::transform(to_upper)) {  // 管道符形式
    printf("%c", c);
}
for (char c : views::transform(str, to_upper)) {  // 函数形式
    printf("%c", c);
}
for (char c : ranges::transform_view(str, to_upper)) {  // 函数形式
    printf("%c", c);
}

auto v = str | views::transform(to_upper);
string s(v.begin(), v.end());  // 用view的迭代器来构造一个新的string

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c++20 ranges库 的相关文章

  • PhoneGap读写SD卡——文本文件方式

    1 从SD卡中的文本文件读取数据 lt script type 61 34 text javascript 34 charset 61 34 utf 8 34 gt 等待加载PhoneGap document addEventListene
  • 如何获取微信uin

    首先解释什么是微信的 uin xff1a uin就是user information xff0c 也就是特定微信用户的ID 为什么要取得uin呢 xff1f xff1a 因为有读取微信聊天记录的需求 xff0c 微信android版的数据库
  • ODBC连接MySQL时中文乱码问题的解决

    按照网上提供的ODBC连接数据库的相关资料编写代码 xff0c 成功编译后运行发现 xff0c 非中文字段显示正确 xff0c 而中文字段却是每个汉字以 xff1f 显示 关于这方面的错误baidu或google下可以找到很多解答方案 xf
  • MySQL批量导入Excel、txt数据

    我想Excel是当今最大众化的批量数据管理软件了吧 xff0c 所以我们会经常涉及到将Excel中数据导入到MySQL中的工作 网上有一些关于直接将Excel导入MySQL的教程 xff0c 不知道是我安装的office不对还是MySQL不
  • Android ADT安装技巧其常见错误处理

    按照一般教程书籍的安装方法 xff0c 无外乎是 xff1a 首先打开eclipse xff0c 然后依次单击Help Install New Software xff0c 如下图所示 xff1a 单击后弹出的Install界面中的 Add
  • ubuntu 第一次SU密码

    Ubuntu刚安装后 xff0c 不能在terminal中运行su命令 xff0c 因为root没有默认密码 xff0c 需要手动设定 以安装ubuntu时输入的用户名登陆 xff0c 该用户在admin组中 xff0c 有权限给root设
  • Android开发——自动连接指定SSID的wifi热点(不加密/加密)

    最近在做一个项目 xff0c 其中涉及到一块 自动连接已存在的wifi热点 的功能 xff0c 在网上查阅了大量资料 xff0c 五花八门 xff0c 但其中一些说的很简单 xff0c 即不能实现傻瓜式的拿来就用 xff0c 有些说的很详细
  • iOS开发:开发者账号申请后真机调试详细步骤

    前提 xff1a 已经成功申请了iOS开发者账号 环境 xff1a xcode 4 6 1 xff1b iOS 6 1 2 1 授权设备 xff1a 进入Apple Developer会员中心 xff0c 点击图中的iOS Provisio
  • Python个人学习记录

    Python个人学习记录 一 输出 xff08 print 函数 xff09 1 控制台输出2 将内容输出到文件中3 不进行换行输出 xff08 输出内容在一行当中 xff09 二 转义字符1 普通转义字符2 特殊用途的字符 xff08 反
  • 解决ERROR 1064 (42000): You have an error in your SQL syntax..

    在MySQL命令行使用sql语句进行建表或者查询表时 xff0c MySQL 报错 例如 xff1a 在下面的数据库中查看like表 当我们输入sql语句进行查询时 xff0c 发现会报错 其实这个问题是语法上的错误 xff0c 在MySQ
  • Onedrive不限速还有5T空间,且行且珍惜

    由于百度网盘的限速 xff0c 不得已开始捣鼓微软的OneDrive网盘 相对于百度网盘 xff0c Onedrive最大的优势是不限速 xff0c 速度也是难得的友好 相对于百度网盘 xff0c Onedrive最大的劣势是空间大小 xf
  • iOS图片的填充方式UIImageView(contentMode)有什么不同

    UIViewContentModeScaleAspectFit 这个图片都会在view里面显示 xff0c 并且比例不变 这就是说 如果图片和view的比例不一样 就会有留白如下图1 图1 UIViewContentModeScaleAsp
  • windows 下包管理工具vcpkg安装

    主要参考博文 xff1a vcpkg安装及使用 我叫电池的博客 CSDN博客 vcpkg安装 由于需要在离线环境下面搭建开发环境 xff0c 所有的包只能离线安装了 xff0c 包括这个管理工具vcpkg的安装 xff0c 也必须是离线安装
  • 【Python】如何发布编写好的Python应用程序之Python Release for Windows(附踩坑经验)

    运筹优化博士 xff0c 只做原创博文 更多关于运筹学 xff0c 优化理论 xff0c 数据科学领域的内容 xff0c 欢迎关注我的知乎账号 xff1a https www zhihu com people wen yu zhi 37 最

随机推荐

  • ubuntu 下更改docker的默认位置

    首先查看docker位置 xff1a docker info 原先的位置默认应该都在 var lib docker 停止docker服务 systemctl stop docker 查看量大容的位置 xff0c 然后在上面创建转移目录文件夹
  • 编译 NDK 编译 freerdp 转载:测试成功

    最近著名的开源rdp客户端freerdp的android版本终于出来了 xff0c 经过9个月的跳票终于release了第一版 下面简单说说编译的过程 这个是需要用到cmake来编译 xff0c 所以系统推荐用ubuntu或者mac xff
  • 1.VMWare-Ubuntu-内存不足处理办法 2.VMWare-Ubuntu-扩展内存后黑屏解决办法

    问题描述 xff1a 1 VMWare Ubuntu 内存不足 2 VMWare Ubuntu 扩展内存后黑屏 解决办法 xff1a 详情参考文章https www cnblogs com codingdog p 14879313 html
  • Linux目录解释

    bin bin是binary 二进制 的缩写 这个目录是对UNIX系统习惯的沿袭 xff0c 存放着使用者最经常使用的命令 例如 xff1a cp ls cat boot 这里存放的是启动LINUX时使用的一些核心文件 dev dev是de
  • 数据库的插入更新语句

    目的 xff1a 实现在数据库插入数据的时候 xff0c 只对重复的数据进行更新 xff1b 实现方式 xff1a 1 在表中建立一个唯一索引 xff0c 主键 xff08 已有唯一索引的特性 xff09 2 在插入数据 sql语句 xff
  • Linux安装Yapi

    需求 xff1a 按公司需求 xff0c 前后端开发 xff0c 由于过往开发都是后端先进行 xff0c 前端须等后端开发玩接口 xff0c 依照开发文档才能进行接口调试 xff0c 大大增加了项目时间 xff0c 故采用YAPI来作为解决
  • mysql8.0 安装 修改密码 允许远程连接

    mysql从5 7一下子跳跃到了8 0 xff0c 其中的改变还是很大 xff0c 有点这里就不说了 xff0c 小伙伴们自己去百度了解一下 xff0c 这里重点说一下 xff0c 安装的事 1 解压后 xff0c 文件下下面是没有my i
  • IOS开发入门之二——第一个App

    如果你对怎么开始IOS开发都不懂的话 xff0c 请看点下面的链接 xff0c 先学习关于IOS开发环境的配置以及Swift语言入门 xff1a IOS开发入门之一 Swift语言基础 本章将教大家创建一个标准的苹果手机应用并让它在手机模拟
  • IOS开发入门之五——storyboard的使用(上)

    需要iOS开发视频资料可以加我微信 1914532832 验证信息请注明 xff1a IOS开发 上节介绍了纯代码开发 xff0c 就是所有页面全部用代码来写 xff0c 纯代码开发缺点就是比较慢的 xff0c 而且很不直观 xff0c 需
  • UILabel文字内容自动换行

    UILabel视图其实是可以显示多行文本的 xff0c 但是如果不做设置 xff0c UILabel默认是显示一行的 xff0c 并且如果文字内容太多 xff0c 超过屏幕的部分就显示不出来了 其实UILabel设置多行文本很简单 xff0
  • 谈谈android的动画

    android动画为app提供更丰富 更绚丽的视觉效果 xff0c 因此app或多或少都会添加动画效果 在此总结一下 xff0c 本人android开发过程中 xff0c 有关动画的内容 一 android动画种类和区别 android动画
  • android好用的第三方库2018使用总结

    需要android开发视频资料可以加我微信 1914532832 验证信息请注明 xff1a android开发 不知不觉2018年已经过了大半 xff0c 来总结一下今年用到的一些好用的框架和第三方库 xff0c 包括App架构 异步通信
  • Linux(debian7)操作基础(四)之CPU频率调整

    在Linux中 xff0c 内核的开发者定义了一套框架模型来完成CPU频率动态调整这一目的 xff0c 它就是CPU Freq系统 如下为CPU的几种模式 xff08 governor参数 xff09 xff1a ondemand xff1
  • ubuntu oh-my-zsh

    简单说明下shell bash zsh sh shell是一个用C语言编写的程序 xff0c 是一种脚本编程语言 xff0c 是一个连接内核和用户的软件 xff0c 是用户使用Linux的桥梁 shell是指一种应用程序 xff0c 这个应
  • 获取携程机票信息(爬虫)

    仅供个人学习使用 xff01 2022 01 01 版 span class token comment 64 author AIslandX span span class token comment 64 date 2022 01 01
  • Ubuntu下~/.bashrc文件的恢复方法

    问题描述 如果不小心在更改环境变量文件 bashrc时出现将文件内容覆盖的情况 xff0c 比如echo hello world gt bashrc没有使用添加模式而是覆盖模式 xff0e NOTE xff1a 非覆盖情况下 xff0c 不
  • Debian11 普通用户启动Wireshark没有权限

    普通用户启动 wireshark 报错 xff0c 没有权限 可以在终端使用 sudo wireshark 启动 解决方法如下 xff1a 1 添加wireshark用户组 sudo groupadd wireshark 2 将dumpca
  • 批量创建txt文本

    最近在进行html学习时 xff0c 用的编辑器是txt文本 xff0c 但每次都要新建文本 xff0c 比较麻烦 xff0c 所以打算创建多个文本 批量创建文件方法 xff1a 1 打开Excel表格 输入以下内容 可以利用excel的特
  • 文本相似度计算工具类

    package com xxxx xclouddesk utils import cn hutool core collection CollUtil import cn hutool extra tokenizer Result impo
  • c++20 ranges库

    ranges库在对元素进行逐一操作或者判断时可以省掉很多循环体 xff0c 使代码的可读性提高 例如 xff0c 要从一个vector中拿出所有的偶数并求平方并逆序排列 xff0c 生成一个新的vector xff0c 以前这样写 xff1