范围库 (C++20)

< cpp

范围库提供处理元素范围的组件,包括各种视图适配器。

定义于头文件 <ranges>
namespace std {

    namespace views = ranges::views;

}

提供命名空间别名 std::views ,作为 std::ranges::views 的缩写。

定义于命名空间 std::ranges
范围访问
定义于头文件 <ranges>
定义于头文件 <iterator>
返回指向范围起始的迭代器
(定制点对象)
返回指向只读范围起始的迭代器
(定制点对象)
返回指示范围结尾的哨位
(定制点对象)
返回指示只读范围结尾的哨位
(定制点对象)
返回指向范围的逆向迭代器
(定制点对象)
返回指向只读范围的逆向迭代器
(定制点对象)
返回指向范围的逆向尾迭代器
(定制点对象)
返回指向只读范围的逆向尾迭代器
(定制点对象)
获得能在常数时间内计算大小的范围的大小
(定制点对象)
获得能在常数时间内计算大小的范围的大小,并将它转换成有符号整数
(定制点对象)
检查范围是否为空
(定制点对象)
获得指向连续范围的起始的指针
(定制点对象)
获得指向只读连续范围的起始的指针
(定制点对象)
范围原语
定义于头文件 <ranges>
获得范围的关联类型
(别名模板)
悬垂迭代器处理
定义于头文件 <ranges>
占位类型,指示不应返回迭代器或子范围,因为它可能悬垂
(类)
获得塑造 borrowed_range 的迭代器类型或子范围类型
(别名模板)
范围概念
定义于头文件 <ranges>
指定类型为范围,即它同时提供 begin 迭代器和 end 哨位
(概念)
指定类型为 range 而且能安全返回从该类型表达式获得的迭代器而无悬垂之虞
(概念)
指定范围可在常数时间内知晓其大小
(概念)
指定范围为视图,即它拥有常数时间的复制/移动/赋值
(概念)
指定范围的迭代器类型满足 input_iterator
(概念)
指定范围的迭代器类型满足 output_iterator
(概念)
指定范围的迭代器类型满足 forward_iterator
(概念)
指定范围的迭代器类型满足 bidirectional_iterator
(概念)
指定范围的迭代器类型满足 random_access_iterator
(概念)
指定范围的迭代器类型满足 contiguous_iterator
(概念)
指定范围拥有相同的迭代器和哨位类型
(概念)
指定针对 range 的要求,令其可安全转换为 view
(概念)
视图
定义于头文件 <ranges>
用于定义 view 的辅助类模板,使用奇特重现模板模式
(类模板)
将迭代器/哨位对结合为一个 view
(类模板)

范围工厂

定义于头文件 <ranges>
定义于命名空间 std::ranges
无元素的空 view
(类模板) (变量模板)
含有具有指定值的单个元素的 view
(类模板) (定制点对象)
由通过重复对某个初值自增所生成的序列组成的 view
(类模板) (定制点对象)
从迭代器和计数创建子范围
(定制点对象)

范围适配器

范围适配器接受 viewable_range 为其第一参数并返回一个 view

若范围适配器仅接收一个参数,则它亦被称为使用管道运算符:若 C 是范围适配器对象且 Rviewable_range ,则此二表达式等价:

C(R)
R | C

亦能连锁一元范围适配器以产生另一范围适配器:若 CD 为范围适配器对象且 Rviewable_range ,则 C | D 亦为范围适配器对象,且此二表达式等价:

R | C | D   // (R | C) | D
R | (C | D)

若范围适配器接收多个参数,则这些形式等价:

adaptor(range, args...)
adaptor(args...)(range)
range | adaptor(args...)

此情况下, adaptor(args...) 为一元范围适配器对象。

定义于头文件 <ranges>
定义于命名空间 std::ranges
包含 range 的所有元素的 view
(别名模板) (范围适配器对象)
某个其他 range 的元素的 view
(类模板)
range 中满足某个谓词的元素构成的 view
(类模板) (范围适配器对象)
对序列的每个元素应用某个变换函数的 view
(类模板) (范围适配器对象)
由另一 view 的前 N 个元素组成的 view
(类模板) (范围适配器对象)
由另一 view 的到首个谓词返回 false 为止的起始元素组成的 view
(类模板) (范围适配器对象)
由另一 view 跳过首 N 个元素组成的 view
(类模板) (范围适配器对象)
由另一 view 跳过元素的起始序列,直至首个谓词返回 false 的元素组成的 view
(类模板) (范围适配器对象)
由拉平 rangeview 所获得的序列构成的 view
(类模板) (范围适配器对象)
用某个分隔符切割另一 view 所获得的子范围的 view
(类模板) (范围适配器对象)
转换 viewcommon_range
(类模板) (范围适配器对象)
以逆序迭代另一双向视图上的元素的 view
(类模板) (范围适配器对象)
由在关联的输入流上相继应用 operator>> 获得的元素组成的 view
(类模板)
选取仿 tuple 值组成的 view 和数值 N ,产生每个 tuple 的第 N 个元素的 view
(类模板) (范围适配器对象)
选取仿 pair 值组成的 view 并产生每个 pair 的第一元素的 view
(类模板) (范围适配器对象)
选取仿 pair 值组成的 view 并产生每个 pair 的第二元素的 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::views::filter(even) | std::views::transform(square)) {
        std::cout << i << ' ';
    }
}

输出:

0 4 16