IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> c++20 ranges库 -> 正文阅读

[数据结构与算法]c++20 ranges库

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

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-12-26 22:27:24  更:2021-12-26 22:29:16 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 17:52:41-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码