范围库 (C++20)
来自cppreference.com
< cpp
范围库提供处理元素范围的组件,包括各种视图适配器。
| 定义于头文件 <ranges>
|
||
| namespace std { namespace view = ranges::view; |
||
提供命名空间别名 std::view ,作为 std::ranges::view 的缩写。
| 定义于头文件
<ranges> | ||
| 定义于命名空间
std::ranges | ||
范围访问 | ||
| (C++20) |
返回指向范围起始的迭代器 (定制点对象) | |
| (C++20) |
返回指向范围结尾的迭代器 (定制点对象) | |
| (C++20) |
返回指向范围的逆向迭代器 (定制点对象) | |
| (C++20) |
返回指向范围的逆向尾迭代器 (定制点对象) | |
| (C++20) |
获得能在常数时间内计算大小的范围的大小 (定制点对象) | |
| (C++20) |
检查范围是否为空 (定制点对象) | |
| (C++20) |
获得指向连续范围的起始的指针 (定制点对象) | |
范围原语 | ||
| 获得范围的迭代器和哨位类型 (别名模板) | ||
悬垂迭代器处理 | ||
| 占位类型,指示不应返回迭代器或子范围,因为它可能悬垂 (类) | ||
获得同时塑造 __ForwardingRange 的 Range 的迭代器类型或子范围类型 (别名模板) | ||
范围概念 | ||
指定类型为范围,即它同时提供 begin 迭代器和 end 哨位 (概念) | ||
| 指定范围可在常数时间内知晓其大小 (概念) | ||
| 指定范围为视图,即它拥有常数时间的复制/移动/赋值 (概念) | ||
指定范围的迭代器类型满足 InputIterator (概念) | ||
指定范围的迭代器类型满足 OutputIterator (概念) | ||
指定范围的迭代器类型满足 ForwardIterator (概念) | ||
指定范围的迭代器类型满足 BidirectionalIterator (概念) | ||
指定范围的迭代器类型满足 RandomAccessIterator (概念) | ||
指定范围的迭代器类型满足 ContiguousIterator (概念) | ||
| 指定范围拥有相同的迭代器和哨位类型 (概念) | ||
指定针对 Range 的要求,令其可安全转换为 View (概念) | ||
视图 | ||
用于定义 View 的辅助类模板,使用奇特重现模板模式 (类模板) | ||
将迭代器/哨位对结合为一个 View (类模板) | ||
[编辑] 范围工厂
| 定义于头文件
<ranges> | |
| 定义于命名空间
std::ranges | |
无元素的空 View (类模板) (变量模板) | |
含有具有指定值的单个元素的 View (类模板) (定制点对象) | |
由通过重复对某个初值自增所生成的序列组成的 View (类模板) (定制点对象) | |
| 从迭代器和计数创建子范围 (定制点对象) | |
[编辑] 范围适配器
范围适配器接受 ViewableRange 为其第一参数并返回 View 。亦能以管道运算符连锁它们:若 C 与 D 为范围适配器而 R 为 ViewableRange ,则此二表达式等价:
D(C(R)) R | C | D
若适配器接收多个参数,则这些形式等价:
adaptor(range, args...) adaptor(args...)(range) range | adaptor(args...)
| 定义于头文件
<ranges> | |
| 定义于命名空间
std::ranges | |
包含 Range 的所有元素的 View (别名模板) (范围适配器对象) | |
某个其他 Range 的元素的 View (类模板) | |
由 Range 中满足某个谓词的元素构成的 View (类模板) (范围适配器对象) | |
对序列的每个元素应用某个变换函数的 View (类模板) (范围适配器对象) | |
由另一 View 的前 N 个元素组成的 View (类模板) (范围适配器对象) | |
由拉平 Range 的 View 所获得的序列构成的 View (类模板) (范围适配器对象) | |
用某个分隔符切割另一 View 所获得的子范围的 View (类模板) (范围适配器对象) | |
转换 View 为 CommonRange (类模板) (范围适配器对象) | |
以逆序迭代另一双向视图上的元素的 View (类模板) (范围适配器对象) | |
某些范围适配器用半正则包装包装其元素或函数对象。
[编辑] 示例
运行此代码
#include <vector> #include <ranges> #include <iostream> int main() { std::vector<int> ints{ 0, 1, 2, 3, 4, 5 }; auto even = [](int i){ return 0 == i % 2; }; auto square = [](int i) { return i * i; }; for (int i : ints | std::view::filter(even) | std::view::transform(square)) { std::cout << i << ' '; } }
输出:
0 4 16

