命名空间
变体
操作

std::ranges::range

来自 cppreference.cn
< cpp‎ | ranges
 
 
范围库 (Ranges library)
范围适配器 (Range adaptors)
 
定义于头文件 <ranges>
template< class T >

concept range = requires( T& t ) {
    ranges::begin(t); // equality-preserving for forward iterators
    ranges::end (t);

};
(C++20 起)

range 概念定义了一个类型,它通过提供一个迭代器和哨兵来表示范围内的元素,从而允许迭代其元素。

目录

[编辑] 语义要求

给定一个表达式 E,使得 decltype((E))TT 只有在以下情况下才符合 range 模型:

[编辑] 注意

一个典型的 range 类只需要提供两个函数

  1. 一个成员函数 begin(),其返回类型符合 input_or_output_iterator 模型。
  2. 一个成员函数 end(),其返回类型符合 sentinel_for<It> 模型,其中 Itbegin() 的返回类型。

另外,它们也可以是非成员函数,通过参数依赖查找找到。

[编辑] 示例

#include <ranges>
 
// A minimum range
struct SimpleRange
{
    int* begin();
    int* end();
};
static_assert(std::ranges::range<SimpleRange>);
 
// Not a range: no begin/end
struct NotRange
{
    int t {};
};
static_assert(!std::ranges::range<NotRange>);
 
// Not a range: begin does not return an input_or_output_iterator
struct NotRange2
{
    void* begin();
    int* end();
};
static_assert(!std::ranges::range<NotRange2>);
 
int main() {}

[编辑] 缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

缺陷报告 应用于 发布时的行为 正确的行为
LWG 3915 C++20 ranges::begin(t)ranges::end(t)
不需要隐式表达式变体
移除了冗余要求
冗余描述