范围库 (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)
获得指向连续范围的起始的指针
(定制点对象) [编辑]
范围原语
获得范围的迭代器和哨位类型
(别名模板) [编辑]
悬垂迭代器处理
占位类型,指示不应返回迭代器或子范围,因为它可能悬垂
(类) [编辑]
获得同时塑造 __ForwardingRangeRange 的迭代器类型或子范围类型
(别名模板) [编辑]
范围概念
指定类型为范围,即它同时提供 begin 迭代器和 end 哨位
(概念) [编辑]
指定范围可在常数时间内知晓其大小
(概念) [编辑]
指定范围为视图,即它拥有常数时间的复制/移动/赋值
(概念) [编辑]
指定范围的迭代器类型满足 InputIterator
(概念) [编辑]
指定范围的迭代器类型满足 OutputIterator
(概念) [编辑]
指定范围的迭代器类型满足 ForwardIterator
(概念) [编辑]
指定范围的迭代器类型满足 BidirectionalIterator
(概念) [编辑]
指定范围的迭代器类型满足 RandomAccessIterator
(概念) [编辑]
指定范围的迭代器类型满足 ContiguousIterator
(概念) [编辑]
指定范围拥有相同的迭代器和哨位类型
(概念) [编辑]
指定针对 Range 的要求,令其可安全转换为 View
(概念) [编辑]
视图
用于定义 View 的辅助类模板,使用奇特重现模板模式
(类模板) [编辑]
将迭代器/哨位对结合为一个 View
(类模板) [编辑]

[编辑] 范围工厂

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

[编辑] 范围适配器

范围适配器接受 ViewableRange 为其第一参数并返回 View 。亦能以管道运算符连锁它们:若 CD 为范围适配器而 RViewableRange ,则此二表达式等价:

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
(类模板) (范围适配器对象) [编辑]
由拉平 RangeView 所获得的序列构成的 View
(类模板) (范围适配器对象) [编辑]
用某个分隔符切割另一 View 所获得的子范围的 View
(类模板) (范围适配器对象) [编辑]
转换 ViewCommonRange
(类模板) (范围适配器对象) [编辑]
以逆序迭代另一双向视图上的元素的 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