Range
反应式编程是基于 数据流 (Data Stream)
和 变化传递 (Propagation of Change Value)
的 声明式 编程方式。数据在传递过程中保持不变。原始数据通过通道符传递到一个一个 view 中,view 对数据进行处理之后又形成了新的数据,就这样,数据通过管道符在一个一个 view 中流动中发生变化,最终成品。
先看一个简单的 Demo 以对 Range 有初步的印象:
#include <iostream>
#include <ranges>
#include <vector>
using namespace std;
int main() {
vector<int> ints { 0, 1, 3, 4, 5 };
auto res = ints | views::filter([](int item) {
return item % 2;
}) | views::transform([](int item) {
return item * item;
});
for(auto const& item : res){
cout << item << ", ";
}
return 0;
}
如代码所述,原始的数据 ints 在成品(形成 res)的过程中分别经过过滤(views::filter)、转换(views::transform)形成,最后由 for 将成品打印出来。ints 在这过程中始终保持不变。
概述
Range 库由头文件 <ranges>
提供,并带来一个命名空间 std::views 。 std::views 名为 视图适配器 ,负责对数据的处理,常用的视图适配器如下:
函数 | 含义 | 作用 |
---|---|---|
谓词 | 根据谓词过滤数据 | |
函数 | 将数据进行变形 | |
size_t | 取走前几个数据 | |
size_t | 丢弃前几个数据 | |
数据流 | 将上一个数据流与指定数据流合并 | |
str | 将上一个数据流根据 str 分割为多个数据 | |
数据流 | 从 map 数据流中提取 key | |
数据流 | 从 map 数据流中提取 value | |
none | 反转数据流中数据的顺序 | |
谓词 | 过滤满足谓词条件的数据 | |
<i,i> | 产生范围数据 | |
data | 产生单个数据 |