######################################## Range ######################################## Range 是 C++ 社区对 :abbr:`反应式编程 ()` 的回应。最初由 boost_ 社区实现, `v3 版本`_ 分离出来成为 C++ 20 标准库的基础。与其类似的还有 RxCpp_ 。Range 相当于 RxCpp_ 的数据处理部分。 反应式编程是基于 :abbr:`数据流 (Data Stream)` 和 :abbr:`变化传递 (Propagation of Change Value)` 的 *声明式* 编程方式。数据在传递过程中保持不变。原始数据通过通道符传递到一个一个 view 中,view 对数据进行处理之后又形成了新的数据,就这样,数据通过管道符在一个一个 view 中流动中发生变化,最终成品。 先看一个简单的 Demo 以对 Range 有初步的印象: .. code-block:: cpp #include #include #include using namespace std; int main() { vector 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 在这过程中始终保持不变。 .. _boost: https://www.boost.org/doc/libs/1_67_0/libs/range/doc/html/index.html .. _`v3 版本`: https://github.com/ericniebler/range-v3 .. _RxCpp: https://github.com/ReactiveX/RxCpp 概述 **************************************** Range 库由头文件 :file:`` 提供,并带来一个命名空间 *std::views* 。 std::views 名为 **视图适配器** ,负责对数据的处理,常用的视图适配器如下: =================== ====== ===================================== `view::filter`_ 谓词 根据谓词过滤数据 `view::transform`_ 函数 将数据进行变形 `view::take`_ size_t 取走前几个数据 `view::drop`_ size_t 丢弃前几个数据 `view::join`_ 数据流 将上一个数据流与指定数据流合并 `view::split`_ str 将上一个数据流根据 str 分割为多个数据 `view::keys`_ 数据流 从 map 数据流中提取 key `view::values`_ 数据流 从 map 数据流中提取 value `view::reverse`_ none 反转数据流中数据的顺序 `view::take_while`_ 谓词 过滤满足谓词条件的数据 `view::iota`_ 产生范围数据 `view::single`_ data 产生单个数据 =================== ====== ===================================== .. _`view::filter`: https://en.cppreference.com/w/cpp/ranges/filter_view .. _`view::transform`: https://en.cppreference.com/w/cpp/ranges/transform_view .. _`view::take`: https://en.cppreference.com/w/cpp/ranges/take_view .. _`view::drop`: https://en.cppreference.com/w/cpp/ranges/drop_view .. _`view::join`: https://en.cppreference.com/w/cpp/ranges/join_view .. _`view::split`: https://en.cppreference.com/w/cpp/ranges/split_view .. _`view::keys`: https://en.cppreference.com/w/cpp/ranges/keys_view .. _`view::values`: https://en.cppreference.com/w/cpp/ranges/values_view .. _`view::reverse`: https://en.cppreference.com/w/cpp/ranges/reverse_view .. _`view::take_while`: https://en.cppreference.com/w/cpp/ranges/take_while_view .. _`view::iota`: https://en.cppreference.com/w/cpp/ranges/iota_view .. _`view::single`: https://en.cppreference.com/w/cpp/ranges/single_view