标准库头文件

标准库头文件<ranges>

C++

语言

标准库头文件

自立与有宿主实现

具名要求

语言支持库

概念库 (C++20)

诊断库

工具库

字符串库

容器库

迭代器库

范围库 (C++20)

算法库

数值库

本地化库

输入/输出库

文件系统库 (C++17)

正则表达式库 (C++11)

原子操作库 (C++11)

线程支持库 (C++11)

技术规范

标准库头文件

语言支持

概念

诊断

通用工具

字符串

本地化

容器

迭代器

范围

算法

数值

输入/输出

正则表达式

文件系统

线程支持

C 兼容

此头文件是范围库的一部分。

命名空间别名

namespace std {

namespace views = ranges::views;

}

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

概念

范围概念

定义于命名空间 std::ranges

range

指定类型为范围,即它同时提供 begin 迭代器和 end 哨位 (概念)

sized_range

指定范围可在常数时间内知晓其大小 (概念)

view

指定范围为视图,即它拥有常数时间的复制/移动/赋值 (概念)

input_range

指定范围的迭代器类型满足 input_iterator (概念)

output_range

指定范围的迭代器类型满足 output_iterator (概念)

forward_range

指定范围的迭代器类型满足 forward_iterator (概念)

bidirectional_range

指定范围的迭代器类型满足 bidirectional_iterator (概念)

random_access_range

指定范围的迭代器类型满足 random_access_iterator (概念)

contiguous_range

指定范围的迭代器类型满足 contiguous_iterator (概念)

common_range

指定范围拥有相同的迭代器和哨位类型 (概念)

viewable_range

指定针对 range 的要求,令其可安全转换为 view (概念)

范围原语

定义于命名空间 std::ranges

iterator_tsentinel_trange_difference_trange_size_t range_value_trange_reference_trange_rvalue_reference_t

获得范围的关联类型 (别名模板)

视图

定义于命名空间 std::ranges

view_interface

用于定义 view 的辅助类模板,使用奇特重现模板模式 (类模板)

subrange

将迭代器/哨位对结合为一个 view (类模板)

悬垂迭代器处理

定义于命名空间 std::ranges

dangling

占位类型,指示不应返回迭代器或子范围,因为它可能悬垂 (类)

borrowed_iterator_tborrowed_subrange_t

获得塑造 borrowed_range 的迭代器类型或子范围类型 (别名模板)

工厂

定义于命名空间 std::ranges

empty_viewviews::empty

无元素的空 view (类模板) (变量模板)

single_viewviews::single

含有具有指定值的单个元素的 view (类模板) (定制点对象)

iota_viewviews::iota

由通过重复对某个初值自增所生成的序列组成的 view (类模板) (定制点对象)

views::counted

从迭代器和计数创建子范围 (定制点对象)

适配器

定义于命名空间 std::ranges

views::all_tviews::all

包含 range 的所有元素的 view (别名模板) (范围适配器对象)

ref_view

某个其他 range 的元素的 view (类模板)

filter_viewviews::filter

由 range 中满足某个谓词的元素构成的 view (类模板) (范围适配器对象)

transform_viewviews::transform

对序列的每个元素应用某个变换函数的 view (类模板) (范围适配器对象)

take_viewviews::take

由另一 view 的前 N 个元素组成的 view (类模板) (范围适配器对象)

join_viewviews::join

由拉平 range 的 view 所获得的序列构成的 view (类模板) (范围适配器对象)

split_viewviews::split

用某个分隔符切割另一 view 所获得的子范围的 view (类模板) (范围适配器对象)

common_viewviews::common

转换 view 为 common_range (类模板) (范围适配器对象)

reverse_viewviews::reverse

以逆序迭代另一双向视图上的元素的 view (类模板) (范围适配器对象)

定制点对象

范围访问

定义于命名空间 std::ranges

ranges::begin(C++20)

返回指向范围起始的迭代器 (定制点对象)

ranges::end(C++20)

返回指示范围结尾的哨位 (定制点对象)

ranges::rbegin(C++20)

返回指向范围的逆向迭代器 (定制点对象)

ranges::rend(C++20)

返回指向范围的逆向尾迭代器 (定制点对象)

ranges::size(C++20)

获得能在常数时间内计算大小的范围的大小 (定制点对象)

ranges::empty(C++20)

检查范围是否为空 (定制点对象)

ranges::data(C++20)

获得指向连续范围的起始的指针 (定制点对象)

概要

#include

#include

namespace std::ranges {

inline namespace /* 未指明 */ {

// 范围访问

inline constexpr /* 未指明 */ begin = /* 未指明 */;

inline constexpr /* 未指明 */ end = /* 未指明 */;

inline constexpr /* 未指明 */ cbegin = /* 未指明 */;

inline constexpr /* 未指明 */ cend = /* 未指明 */;

inline constexpr /* 未指明 */ rbegin = /* 未指明 */;

inline constexpr /* 未指明 */ rend = /* 未指明 */;

inline constexpr /* 未指明 */ crbegin = /* 未指明 */;

inline constexpr /* 未指明 */ crend = /* 未指明 */;

inline constexpr /* 未指明 */ size = /* 未指明 */;

inline constexpr /* 未指明 */ empty = /* 未指明 */;

inline constexpr /* 未指明 */ data = /* 未指明 */;

inline constexpr /* 未指明 */ cdata = /* 未指明 */;

}

// 范围

template

using iterator_t = decltype(ranges::begin(declval()));

template

using sentinel_t = decltype(ranges::end(declval()));

template

concept Range = /* 见定义 */;

// 有大小范围

template

inline constexpr bool disable_sized_range = false;

template

concept SizedRange = /* 见定义 */;

// 视图

template

inline constexpr bool enable_view = /* 见定义 */;

struct view_base { };

template

concept View = /* 见定义 */;

// 其他范围细化

template

concept OutputRange = /* 见定义 */;

template

concept InputRange = /* 见定义 */;

template

concept ForwardRange = /* 见定义 */;

template

concept BidirectionalRange = /* 见定义 */;

template

concept RandomAccessRange = /* 见定义 */;

template

concept ContiguousRange = /* 见定义 */;

template

concept CommonRange = /* 见定义 */;

template

concept ViewableRange = /* 见定义 */;

// 类模板 view_interface

template

requires is_class_v && Same>

class view_interface;

// 子范围

enum class subrange_kind : bool { unsized, sized };

template S = I, subrange_kind K = /* 见定义 */>

requires (K == subrange_kind::sized || !SizedSentinel)

class subrange;

// 悬垂迭代器处理

struct dangling;

template

using safe_iterator_t = conditional_t<__ForwardingRange, iterator_t, dangling>;

template

using safe_subrange_t =

conditional_t<__ForwardingRange, subrange>, dangling>;

// 空视图

template

requires is_object_v

class empty_view;

namespace view {

template

inline constexpr empty_view empty{};

}

// 单体视图

template

requires is_object_v

class single_view;

namespace view { inline constexpr /* 未指明 */ single = /* 未指明 */; }

// iota 视图

template

requires __WeaklyEqualityComparableWith

class iota_view;

namespace view { inline constexpr /* 未指明 */ iota = /* 未指明 */; }

// 全视图

namespace view { inline constexpr /* 未指明 */ all = /* 未指明 */; }

template

using all_view = decltype(view::all(declval()));

template

requires is_object_v

class ref_view;

// 过滤视图

template> Pred>

requires View && is_object_v

class filter_view;

namespace view { inline constexpr /* 未指明 */ filter = /* 未指明 */; }

// 变换视图

template

requires View && is_object_v &&

RegularInvocable>>

class transform_view;

namespace view { inline constexpr /* 未指明 */ transform = /* 未指明 */; }

// 取部分视图

template class take_view;

namespace view { inline constexpr /* 未指明 */ take = /* 未指明 */; }

// 连接视图

template

requires View && InputRange>> &&

(is_reference_v>> ||

View>>)

class join_view;

namespace view { inline constexpr /* 未指明 */ join = /* 未指明 */; }

// 分割视图

template

concept __TinyRange = /* 见定义 */; // 仅用于阐释

template

requires View && View &&

IndirectlyComparable, iterator_t, ranges::equal_to> &&

(ForwardRange || __TinyRange)

class split_view;

namespace view { inline constexpr /* 未指明 */ split = /* 未指明 */; }

// 计数视图

namespace view { inline constexpr /* 未指明 */ counted = /* 未指明 */; }

// 公共视图

template

requires (!CommonRange)

class common_view;

namespace view { inline constexpr /* 未指明 */ common = /* 未指明 */; }

// 逆向视图

template

requires BidirectionalRange

class reverse_view;

namespace view { inline constexpr /* 未指明 */ reverse = /* 未指明 */; }

}

namespace std {

namespace view = ranges::view;

template

struct tuple_size>

: integral_constant {};

template

struct tuple_element<0, ranges::subrange> {

using type = I;

};

template

struct tuple_element<1, ranges::subrange> {

using type = S;

};

}

概念 range

namespace std::ranges {

template

concept __RangeImpl = // 仅用于阐释

requires(T&& t) {

ranges::begin(std::forward(t)); // 有时保持相等性(见定义)

ranges::end(std::forward(t));

};

template

concept Range = __RangeImpl;

template

concept __ForwardingRange = // 仅用于阐释

Range && __RangeImpl;

}

概念 sized_range

namespace std::ranges {

template

concept SizedRange =

Range &&

!disable_sized_range> &&

requires(T& t) { ranges::size(t); };

}

概念 view

namespace std::ranges {

template

inline constexpr bool enable_view = /* 见定义 */;

template

concept View =

Range && Semiregular && enable_view;

}

概念 output_range

namespace std::ranges {

template

concept OutputRange =

Range && OutputIterator, T>;

}

概念 input_range

namespace std::ranges {

template

concept InputRange =

Range && InputIterator>;

}

概念 forward_range

namespace std::ranges {

template

concept ForwardRange =

InputRange && ForwardIterator>;

}

概念 bidirectional_range

namespace std::ranges {

template

concept BidirectionalRange =

ForwardRange && BidirectionalIterator>;

}

概念 random_access_range

namespace std::ranges {

template

concept RandomAccessRange =

BidirectionalRange && RandomAccessIterator>;

}

概念 contiguous_range

namespace std::ranges {

template

concept ContiguousRange =

RandomAccessRange && ContiguousIterator> &&

requires(T& t) {

{ ranges::data(t) } -> Same>>>;

};

}

概念 common_range

namespace std::ranges {

template

concept CommonRange =

Range && Same, sentinel_t>;

}

概念 viewable_range

namespace std::ranges {

template

concept ViewableRange =

Range && (__ForwardingRange || View>);

}

辅助概念

namespace std::ranges { // 未指定,仅用于名字查找

template

concept __SimpleView = // 仅用于阐释

View && Range &&

Same, iterator_t> &&

Same, sentinel_t>;

template

concept __HasArrow = // 仅用于阐释

is_pointer_v || requires(I i) { i.operator->(); };

template

concept __NotSameAs = // 仅用于阐释

!Same, remove_cvref_t>;

template

concept _Decrementable = // 仅用于阐释

Incrementable && requires(I i) {

{ --i } -> Same;

{ i-- } -> Same;

};

template

concept _Advanceable = // 仅用于阐释

_Decrementable && StrictTotallyOrdered &&

requires(I i, const I j, const iter_difference_t n) {

{ i += n } -> Same;

{ i -= n } -> Same;

{ j + n } -> Same;

{ n + j } -> Same;

{ j - n } -> Same;

{ j - j } -> Same>;

};

}

注意:这些名字仅用于阐释目的,它们不是接口的一部分。

类模板 std::ranges::view_interface

namespace std::ranges {

template

requires is_class_v && Same>

class view_interface : public view_base {

private:

constexpr D& derived() noexcept { // 仅用于阐释

return static_cast(*this);

}

constexpr const D& derived() const noexcept { // 仅用于阐释

return static_cast(*this);

}

public:

constexpr bool empty() requires ForwardRange {

return ranges::begin(derived()) == ranges::end(derived());

}

constexpr bool empty() const requires ForwardRange {

return ranges::begin(derived()) == ranges::end(derived());

}

constexpr explicit operator bool()

requires requires { ranges::empty(derived()); } {

return !ranges::empty(derived());

}

constexpr explicit operator bool() const

requires requires { ranges::empty(derived()); } {

return !ranges::empty(derived());

}

constexpr auto data() requires ContiguousIterator> {

return ranges::empty(derived()) ? nullptr : addressof(*ranges::begin(derived()));

}

constexpr auto data() const

requires Range && ContiguousIterator> {

return ranges::empty(derived()) ? nullptr : addressof(*ranges::begin(derived()));

}

constexpr auto size() requires ForwardRange &&

SizedSentinel, iterator_t> {

return ranges::end(derived()) - ranges::begin(derived());

}

constexpr auto size() const requires ForwardRange &&

SizedSentinel, iterator_t> {

return ranges::end(derived()) - ranges::begin(derived());

}

constexpr decltype(auto) front() requires ForwardRange;

constexpr decltype(auto) front() const requires ForwardRange;

constexpr decltype(auto) back() requires BidirectionalRange && CommonRange;

constexpr decltype(auto) back() const

requires BidirectionalRange && CommonRange;

template

constexpr decltype(auto) operator[](iter_difference_t> n) {

return ranges::begin(derived())[n];

}

template

constexpr decltype(auto) operator[](iter_difference_t> n) const {

return ranges::begin(derived())[n];

}

};

}

类模板 std::ranges::subrange

namespace std::ranges {

template

concept __PairLike = // 仅用于阐释

!is_reference_v && requires(T t) {

typename tuple_size::type; // 确保 tuple_­size 完整

requires DerivedFrom, integral_constant>;

typename tuple_element_t<0, remove_const_t>;

typename tuple_element_t<1, remove_const_t>;

{ get<0>(t) } -> const tuple_element_t<0, T>&;

{ get<1>(t) } -> const tuple_element_t<1, T>&;

};

template

concept __PairLikeConvertibleTo = // 仅用于阐释

!Range && __PairLike> &&

requires(T&& t) {

{ get<0>(std::forward(t)) } -> ConvertibleTo;

{ get<1>(std::forward(t)) } -> ConvertibleTo;

};

template

concept __PairLikeConvertibleFrom = // 仅用于阐释

!Range && __PairLike && Constructible;

template

concept __IteratorSentinelPair = // 仅用于阐释

!Range && __PairLike &&

Sentinel, tuple_element_t<0, T>>;

template S = I, subrange_kind K =

SizedSentinel ? subrange_kind::sized : subrange_kind::unsized>

requires (K == subrange_kind::sized || !SizedSentinel)

class subrange : public view_interface> {

private:

static constexpr bool StoreSize = // 仅用于阐释

K == subrange_kind::sized && !SizedSentinel;

I begin_ = I(); // 仅用于阐释

S end_ = S(); // 仅用于阐释

iter_difference_t size_ = 0; // 仅用于阐释;

// 仅当 StoreSize 为 true 时才存在

public:

subrange() = default;

constexpr subrange(I i, S s) requires (!StoreSize);

constexpr subrange(I i, S s, iter_difference_t n)

requires (K == subrange_kind::sized);

template<__NotSameAs R>

requires __ForwardingRange &&

ConvertibleTo, I> && ConvertibleTo, S>

constexpr subrange(R&& r) requires (!StoreSize || SizedRange);

template<__ForwardingRange R>

requires ConvertibleTo, I> && ConvertibleTo, S>

constexpr subrange(R&& r, iter_difference_t n)

requires (K == subrange_kind::sized)

: subrange{ranges::begin(r), ranges::end(r), n}

{}

template<__NotSameAs PairLike>

requires __PairLikeConvertibleTo

constexpr subrange(PairLike&& r) requires (!StoreSize)

: subrange{std::get<0>(std::forward(r)),

std::get<1>(std::forward(r))}

{}

template<__PairLikeConvertibleTo PairLike>

constexpr subrange(PairLike&& r, iter_difference_t n)

requires (K == subrange_kind::sized)

: subrange{std::get<0>(std::forward(r)),

std::get<1>(std::forward(r)), n}

{}

template<__NotSameAs PairLike>

requires __PairLikeConvertibleFrom

constexpr operator PairLike() const;

constexpr I begin() const;

constexpr S end() const;

constexpr bool empty() const;

constexpr iter_difference_t size() const

requires (K == subrange_kind::sized);

[[nodiscard]] constexpr subrange next(iter_difference_t n = 1) const;

[[nodiscard]] constexpr subrange prev(iter_difference_t n = 1) const

requires BidirectionalIterator;

constexpr subrange& advance(iter_difference_t n);

friend constexpr I begin(subrange&& r) { return r.begin(); }

friend constexpr S end(subrange&& r) { return r.end(); }

};

template S>

subrange(I, S, iter_difference_t) -> subrange;

template<__IteratorSentinelPair P>

subrange(P) -> subrange, tuple_element_t<1, P>>;

template<__IteratorSentinelPair P>

subrange(P, iter_difference_t>) ->

subrange, tuple_element_t<1, P>, subrange_kind::sized>;

template<__ForwardingRange R>

subrange(R&&) ->

subrange, sentinel_t,

(SizedRange || SizedSentinel, iterator_t>)

? subrange_kind::sized : subrange_kind::unsized>;

template<__ForwardingRange R>

subrange(R&&, iter_difference_t>) ->

subrange, sentinel_t, subrange_kind::sized>;

template

requires (N < 2)

constexpr auto get(const subrange& r);

}

namespace std {

using ranges::get;

}

类 std::ranges::dangling

namespace std::ranges {

struct dangling {

constexpr dangling() noexcept = default;

template

constexpr dangling(Args&&...) noexcept { }

};

}

类模板 std::ranges::empty_view

namespace std::ranges {

template

requires is_object_v

class empty_view : public view_interface> {

public:

static constexpr T* begin() noexcept { return nullptr; }

static constexpr T* end() noexcept { return nullptr; }

static constexpr T* data() noexcept { return nullptr; }

static constexpr ptrdiff_t size() noexcept { return 0; }

static constexpr bool empty() noexcept { return true; }

friend constexpr T* begin(empty_view) noexcept { return nullptr; }

friend constexpr T* end(empty_view) noexcept { return nullptr; }

};

}

类模板 std::ranges::empty_view

namespace std::ranges {

template

requires is_object_v

class single_view : public view_interface> {

private:

semiregular_box value_; // 仅用于阐释

public:

single_view() = default;

constexpr explicit single_view(const T& t);

constexpr explicit single_view(T&& t);

template

requires Constructible

constexpr single_view(in_place_t, Args&&... args);

constexpr T* begin() noexcept;

constexpr const T* begin() const noexcept;

constexpr T* end() noexcept;

constexpr const T* end() const noexcept;

static constexpr ptrdiff_t size() noexcept;

constexpr T* data() noexcept;

constexpr const T* data() const noexcept;

};

}

类模板 std::ranges::iota_view

namespace std::ranges {

template

concept _Decrementable = // 仅用于阐释

/* 见定义 */;

template

concept _Advanceable = // 仅用于阐释

/* 见定义 */;

template

requires __WeaklyEqualityComparableWith

class iota_view : public view_interface> {

private:

// 类 iota_­view​::​iterator

struct iterator; // 仅用于阐释

// 类 iota_­view​::​sentinel

struct sentinel; // 仅用于阐释

W value_ = W(); // 仅用于阐释

Bound bound_ = Bound(); // 仅用于阐释

public:

iota_view() = default;

constexpr explicit iota_view(W value);

constexpr iota_view(type_identity_t value,

type_identity_t bound);

constexpr iterator begin() const;

constexpr sentinel end() const;

constexpr iterator end() const requires Same;

constexpr auto size() const

requires (Same && _Advanceable) ||

(Integral && Integral) ||

SizedSentinel

{ return bound_ - value_; }

};

template

requires (!Integral || !Integral || is_signed_v == is_signed_v)

iota_view(W, Bound) -> iota_view;

}

类 std::ranges::iota_view::iterator

namespace std::ranges {

template

struct iota_view::iterator {

private:

W value_ = W(); // 仅用于阐释

public:

using iterator_category = /* 见定义 */;

using value_type = W;

using difference_type = iter_difference_t;

iterator() = default;

constexpr explicit iterator(W value);

constexpr W operator*() const noexcept(is_nothrow_copy_constructible_v);

constexpr iterator& operator++();

constexpr void operator++(int);

constexpr iterator operator++(int) requires Incrementable;

constexpr iterator& operator--() requires _Decrementable;

constexpr iterator operator--(int) requires _Decrementable;

constexpr iterator& operator+=(difference_type n)

requires _Advanceable;

constexpr iterator& operator-=(difference_type n)

requires _Advanceable;

constexpr W operator[](difference_type n) const

requires _Advanceable;

friend constexpr bool operator==(const iterator& x, const iterator& y)

requires EqualityComparable;

friend constexpr bool operator!=(const iterator& x, const iterator& y)

requires EqualityComparable;

friend constexpr bool operator<(const iterator& x, const iterator& y)

requires StrictTotallyOrdered;

friend constexpr bool operator>(const iterator& x, const iterator& y)

requires StrictTotallyOrdered;

friend constexpr bool operator<=(const iterator& x, const iterator& y)

requires StrictTotallyOrdered;

friend constexpr bool operator>=(const iterator& x, const iterator& y)

requires StrictTotallyOrdered;

friend constexpr iterator operator+(iterator i, difference_type n)

requires _Advanceable;

friend constexpr iterator operator+(difference_type n, iterator i)

requires _Advanceable;

friend constexpr iterator operator-(iterator i, difference_type n)

requires _Advanceable;

friend constexpr difference_type operator-(const iterator& x, const iterator& y)

requires _Advanceable;

};

}

类 std::ranges::iota_view::sentinel

namespace std::ranges {

template

struct iota_view::sentinel {

private:

Bound bound_ = Bound(); // 仅用于阐释

public:

sentinel() = default;

constexpr explicit sentinel(Bound bound);

friend constexpr bool operator==(const iterator& x, const sentinel& y);

friend constexpr bool operator==(const sentinel& x, const iterator& y);

friend constexpr bool operator!=(const iterator& x, const sentinel& y);

friend constexpr bool operator!=(const sentinel& x, const iterator& y);

};

}

类模板 std::ranges::ref_view

namespace std::ranges {

template

requires is_object_v

class ref_view : public view_interface> {

private:

R* r_ = nullptr; // 仅用于阐释

public:

constexpr ref_view() noexcept = default;

template<__NotSameAs T>

requires /* 见定义 */

constexpr ref_view(T&& t);

constexpr R& base() const { return *r_; }

constexpr iterator_t begin() const { return ranges::begin(*r_); }

constexpr sentinel_t end() const { return ranges::end(*r_); }

constexpr bool empty() const

requires requires { ranges::empty(*r_); }

{ return ranges::empty(*r_); }

constexpr auto size() const requires SizedRange

{ return ranges::size(*r_); }

constexpr auto data() const requires ContiguousRange

{ return ranges::data(*r_); }

friend constexpr iterator_t begin(ref_view r)

{ return r.begin(); }

friend constexpr sentinel_t end(ref_view r)

{ return r.end(); }

};

template

ref_view(R&) -> ref_view;

}

类模板 std::ranges::filter_view

namespace std::ranges {

template> Pred>

requires View && is_object_v

class filter_view : public view_interface> {

private:

V base_ = V(); // 仅用于阐释

semiregular_box pred_; // 仅用于阐释

// 类 filter_view​::​iterator

class iterator; // 仅用于阐释

// 类 filter_view​::​sentinel

class sentinel; // 仅用于阐释

public:

filter_view() = default;

constexpr filter_view(V base, Pred pred);

template

requires ViewableRange && Constructible>

constexpr filter_view(R&& r, Pred pred);

constexpr V base() const;

constexpr iterator begin();

constexpr auto end() {

if constexpr (CommonRange)

return iterator{*this, ranges::end(base_)};

else

return sentinel{*this};

}

};

template

filter_view(R&&, Pred) -> filter_view, Pred>;

}

类 std::ranges::filter_view::iterator

namespace std::ranges {

template

class filter_view::iterator {

private:

iterator_t current_ = iterator_t(); // 仅用于阐释

filter_view* parent_ = nullptr; // 仅用于阐释

public:

using iterator_concept = /* 见定义 */;

using iterator_category = /* 见定义 */;

using value_type = iter_value_t>;

using difference_type = iter_difference_t>;

iterator() = default;

constexpr iterator(filter_view& parent, iterator_t current);

constexpr iterator_t base() const;

constexpr iter_reference_t> operator*() const;

constexpr iterator_t operator->() const

requires has-arrow>;

constexpr iterator& operator++();

constexpr void operator++(int);

constexpr iterator operator++(int) requires ForwardRange;

constexpr iterator& operator--() requires BidirectionalRange;

constexpr iterator operator--(int) requires BidirectionalRange;

friend constexpr bool operator==(const iterator& x, const iterator& y)

requires EqualityComparable>;

friend constexpr bool operator!=(const iterator& x, const iterator& y)

requires EqualityComparable>;

friend constexpr iter_rvalue_reference_t> iter_move(const iterator& i)

noexcept(noexcept(ranges::iter_move(i.current_)));

friend constexpr void iter_swap(const iterator& x, const iterator& y)

noexcept(noexcept(ranges::iter_swap(x.current_, y.current_)))

requires IndirectlySwappable>;

};

}

类 std::ranges::filter_view::sentinel

namespace std::ranges {

template

class filter_view::sentinel {

private:

sentinel_t end_ = sentinel_t(); // 仅用于阐释

public:

sentinel() = default;

constexpr explicit sentinel(filter_view& parent);

constexpr sentinel_t base() const;

friend constexpr bool operator==(const iterator& x, const sentinel& y);

friend constexpr bool operator==(const sentinel& x, const iterator& y);

friend constexpr bool operator!=(const iterator& x, const sentinel& y);

friend constexpr bool operator!=(const sentinel& x, const iterator& y);

};

}

类模板 std::ranges::transform_view

namespace std::ranges {

template

requires View && is_object_v &&

RegularInvocable>>

class transform_view : public view_interface> {

private:

// 类模板 transform_view​::​iterator

template struct iterator; // 仅用于阐释

// 类模板 transform_view​::​sentinel

template struct sentinel; // 仅用于阐释

V base_ = V(); // 仅用于阐释

semiregular_box fun_; // 仅用于阐释

public:

transform_view() = default;

constexpr transform_view(V base, F fun);

template

requires ViewableRange && Constructible>

constexpr transform_view(R&& r, F fun);

constexpr V base() const;

constexpr iterator begin();

constexpr iterator begin() const

requires Range &&

RegularInvocable>>;

constexpr sentinel end();

constexpr iterator end() requires CommonRange;

constexpr sentinel end() const

requires Range &&

RegularInvocable>>;

constexpr iterator end() const

requires CommonRange &&

RegularInvocable>>;

constexpr auto size() requires SizedRange { return ranges::size(base_); }

constexpr auto size() const requires SizedRange

{ return ranges::size(base_); }

};

template

transform_view(R&&, F) -> transform_view, F>;

}

类模板 std::ranges::transform_view::iterator

namespace std::ranges {

template

template

class transform_view::iterator {

private:

using Parent = // 仅用于阐释

conditional_t;

using Base = // 仅用于阐释

conditional_t;

iterator_t current_ = // 仅用于阐释

iterator_t();

Parent* parent_ = nullptr; // 仅用于阐释

public:

using iterator_concept = /* 见定义 */;

using iterator_category = /* 见定义 */;

using value_type =

remove_cvref_t>>>;

using difference_type = iter_difference_t>;

iterator() = default;

constexpr iterator(Parent& parent, iterator_t current);

constexpr iterator(iterator i)

requires Const && ConvertibleTo, iterator_t>;

constexpr iterator_t base() const;

constexpr decltype(auto) operator*() const

{ return invoke(*parent_->fun_, *current_); }

constexpr iterator& operator++();

constexpr void operator++(int);

constexpr iterator operator++(int) requires ForwardRange;

constexpr iterator& operator--() requires BidirectionalRange;

constexpr iterator operator--(int) requires BidirectionalRange;

constexpr iterator& operator+=(difference_type n)

requires RandomAccessRange;

constexpr iterator& operator-=(difference_type n)

requires RandomAccessRange;

constexpr decltype(auto) operator[](difference_type n) const

requires RandomAccessRange

{ return invoke(*parent_->fun_, current_[n]); }

friend constexpr bool operator==(const iterator& x, const iterator& y)

requires EqualityComparable>;

friend constexpr bool operator!=(const iterator& x, const iterator& y)

requires EqualityComparable>;

friend constexpr bool operator<(const iterator& x, const iterator& y)

requires RandomAccessRange;

friend constexpr bool operator>(const iterator& x, const iterator& y)

requires RandomAccessRange;

friend constexpr bool operator<=(const iterator& x, const iterator& y)

requires RandomAccessRange;

friend constexpr bool operator>=(const iterator& x, const iterator& y)

requires RandomAccessRange;

friend constexpr iterator operator+(iterator i, difference_type n)

requires RandomAccessRange;

friend constexpr iterator operator+(difference_type n, iterator i)

requires RandomAccessRange;

friend constexpr iterator operator-(iterator i, difference_type n)

requires RandomAccessRange;

friend constexpr difference_type operator-(const iterator& x, const iterator& y)

requires RandomAccessRange;

friend constexpr decltype(auto) iter_move(const iterator& i)

noexcept(noexcept(invoke(*i.parent_->fun_, *i.current_)))

{

if constexpr (is_lvalue_reference_v)

return std::move(*i);

else

return *i;

}

friend constexpr void iter_swap(const iterator& x, const iterator& y)

noexcept(noexcept(ranges::iter_swap(x.current_, y.current_)))

requires IndirectlySwappable>;

};

}

类模板 std::ranges::transform_view::sentinel

namespace std::ranges {

template

template

class transform_view::sentinel {

private:

using Parent = // 仅用于阐释

conditional_t;

using Base = conditional_t; // 仅用于阐释

sentinel_t end_ = sentinel_t(); // 仅用于阐释

public:

sentinel() = default;

constexpr explicit sentinel(sentinel_t end);

constexpr sentinel(sentinel i)

requires Const && ConvertibleTo, sentinel_t>;

constexpr sentinel_t base() const;

friend constexpr bool operator==(const iterator& x, const sentinel& y);

friend constexpr bool operator==(const sentinel& x, const iterator& y);

friend constexpr bool operator!=(const iterator& x, const sentinel& y);

friend constexpr bool operator!=(const sentinel& x, const iterator& y);

friend constexpr iter_difference_t>

operator-(const iterator& x, const sentinel& y)

requires SizedSentinel, iterator_t>;

friend constexpr iter_difference_t>

operator-(const sentinel& y, const iterator& x)

requires SizedSentinel, iterator_t>;

};

}

类模板 std::ranges::take_view

namespace std::ranges {

template

class take_view : public view_interface> {

private:

V base_ = V(); // 仅用于阐释

iter_difference_t> count_ = 0; // 仅用于阐释

// 类模板 take_­view​::​sentinel

template struct sentinel; // 仅用于阐释

public:

take_view() = default;

constexpr take_view(V base, iter_difference_t> count);

template

requires Constructible>

constexpr take_view(R&& r, iter_difference_t> count);

constexpr V base() const;

constexpr auto begin() requires (!__SimpleView) {

if constexpr (SizedRange) {

if constexpr (RandomAccessRange)

return ranges::begin(base_);

else

return counted_iterator{ranges::begin(base_), size()};

} else

return counted_iterator{ranges::begin(base_), count_};

}

constexpr auto begin() const requires Range {

if constexpr (SizedRange) {

if constexpr (RandomAccessRange)

return ranges::begin(base_);

else

return counted_iterator{ranges::begin(base_), size()};

} else

return counted_iterator{ranges::begin(base_), count_};

}

constexpr auto end() requires (!__SimpleView) {

if constexpr (SizedRange) {

if constexpr (RandomAccessRange)

return ranges::begin(base_) + size();

else

return default_sentinel;

} else

return sentinel{ranges::end(base_)};

}

constexpr auto end() const requires Range {

if constexpr (SizedRange) {

if constexpr (RandomAccessRange)

return ranges::begin(base_) + size();

else

return default_sentinel;

} else

return sentinel{ranges::end(base_)};

}

constexpr auto size() requires SizedRange {

auto n = ranges::size(base_);

return ranges::min(n, static_cast(count_));

}

constexpr auto size() const requires SizedRange {

auto n = ranges::size(base_);

return ranges::min(n, static_cast(count_));

}

};

template

take_view(R&&, iter_difference_t>)

-> take_view>;

}

类模板 std::ranges::take_view::sentinel

namespace std::ranges {

template

template

class take_view::sentinel {

private:

using Base = conditional_t; // 仅用于阐释

using CI = counted_iterator>; // 仅用于阐释

sentinel_t end_ = sentinel_t(); // 仅用于阐释

public:

sentinel() = default;

constexpr explicit sentinel(sentinel_t end);

constexpr sentinel(sentinel s)

requires Const && ConvertibleTo, sentinel_t>;

constexpr sentinel_t base() const;

friend constexpr bool operator==(const sentinel& x, const CI& y);

friend constexpr bool operator==(const CI& y, const sentinel& x);

friend constexpr bool operator!=(const sentinel& x, const CI& y);

friend constexpr bool operator!=(const CI& y, const sentinel& x);

};

}

类模板 std::ranges::join_view

namespace std::ranges {

template

requires View && InputRange>> &&

(is_reference_v>> ||

View>>)

class join_view : public view_interface> {

private:

using InnerRng = // 仅用于阐释

iter_reference_t>;

// 类模板 join_­view​::​iterator

template

struct iterator; // 仅用于阐释

// 类模板 join_­view​::​sentinel

template

struct sentinel; // 仅用于阐释

V base_ = V(); // 仅用于阐释

all_view inner_ = // 仅用于阐释,

all_view(); // 仅当 !is_reference_v 时才存在

public:

join_view() = default;

constexpr explicit join_view(V base);

template

requires ViewableRange && Constructible>

constexpr explicit join_view(R&& r);

constexpr auto begin() {

return iterator<__SimpleView>{*this, ranges::begin(base_)};

}

constexpr auto begin() const

requires InputRange &&

is_reference_v>> {

return iterator{*this, ranges::begin(base_)};

}

constexpr auto end() {

if constexpr (ForwardRange &&

is_reference_v && ForwardRange &&

CommonRange && CommonRange)

return iterator<__SimpleView>{*this, ranges::end(base_)};

else

return sentinel<__SimpleView>{*this};

}

constexpr auto end() const

requires InputRange &&

is_reference_v>> {

if constexpr (ForwardRange &&

is_reference_v>> &&

ForwardRange>> &&

CommonRange &&

CommonRange>>)

return iterator{*this, ranges::end(base_)};

else

return sentinel{*this};

}

};

template

explicit join_view(R&&) -> join_view>;

}

类模板 std::ranges::join_view::iterator

namespace std::ranges {

template

template

struct join_view::iterator {

private:

using Parent = // 仅用于阐释

conditional_t;

using Base = conditional_t; // 仅用于阐释

static constexpr bool ref_is_glvalue = // 仅用于阐释

is_reference_v>>;

iterator_t outer_ = iterator_t(); // 仅用于阐释

iterator_t>> inner_ = // 仅用于阐释

iterator_t>>();

Parent* parent_ = nullptr; // 仅用于阐释

constexpr void satisfy(); // 仅用于阐释

public:

using iterator_concept = /* 见定义 */;

using iterator_category = /* 见定义 */;

using value_type =

iter_value_t>>>;

using difference_type = /* 见定义 */;

iterator() = default;

constexpr iterator(Parent& parent, iterator_t outer);

constexpr iterator(iterator i)

requires Const &&

ConvertibleTo, iterator_t> &&

ConvertibleTo,

iterator_t>>>;

constexpr decltype(auto) operator*() const { return *inner_; }

constexpr iterator_t operator->() const

requires __HasArrow>;

constexpr iterator& operator++();

constexpr void operator++(int);

constexpr iterator operator++(int)

requires ref_is_glvalue && ForwardRange &&

ForwardRange>>;

constexpr iterator& operator--()

requires ref_is_glvalue && BidirectionalRange &&

BidirectionalRange>>;

constexpr iterator operator--(int)

requires ref_is_glvalue && BidirectionalRange &&

BidirectionalRange>>;

friend constexpr bool operator==(const iterator& x, const iterator& y)

requires ref_is_glvalue && EqualityComparable> &&

EqualityComparable>>>;

friend constexpr bool operator!=(const iterator& x, const iterator& y)

requires ref_is_glvalue && EqualityComparable> &&

EqualityComparable>>>;

friend constexpr decltype(auto) iter_move(const iterator& i)

noexcept(noexcept(ranges::iter_move(i.inner_))) {

return ranges::iter_move(i.inner_);

}

friend constexpr void iter_swap(const iterator& x, const iterator& y)

noexcept(noexcept(ranges::iter_swap(x.inner_, y.inner_)));

};

}

类模板 std::ranges::join_view::sentinel

namespace std::ranges {

template

template

struct join_view::sentinel {

private:

using Parent = // 仅用于阐释

conditional_t;

using Base = conditional_t; // 仅用于阐释

sentinel_t end_ = sentinel_t(); // 仅用于阐释

public:

sentinel() = default;

constexpr explicit sentinel(Parent& parent);

constexpr sentinel(sentinel s)

requires Const && ConvertibleTo, sentinel_t>;

friend constexpr bool operator==(const iterator& x, const sentinel& y);

friend constexpr bool operator==(const sentinel& x, const iterator& y);

friend constexpr bool operator!=(const iterator& x, const sentinel& y);

friend constexpr bool operator!=(const sentinel& x, const iterator& y);

};

}

类模板 std::ranges::split_­view

namespace std::ranges {

template struct __require_constant; // 仅用于阐释

template

concept __TinyRange = // 仅用于阐释

SizedRange &&

requires { typename __require_constant::size()>; } &&

(remove_reference_t::size() <= 1);

template

requires View && View &&

IndirectlyComparable, iterator_t, ranges::equal_to> &&

(ForwardRange || __TinyRange)

class split_view : public view_interface> {

private:

V base_ = V(); // 仅用于阐释

Pattern pattern_ = Pattern(); // 仅用于阐释

iterator_t current_ = iterator_t(); // 仅用于阐释,

// 仅当 !ForwardRange 时才存在

// 类模板 split_­view​::​outer_­iterator

template struct outer_iterator; // 仅用于阐释

// 类模板 split_­view​::​inner_­iterator

template struct inner_iterator; // 仅用于阐释

public:

split_view() = default;

constexpr split_view(V base, Pattern pattern);

template

requires Constructible> &&

Constructible>

constexpr split_view(R&& r, P&& p);

template

requires Constructible> &&

Constructible>>>

constexpr split_view(R&& r, iter_value_t> e);

constexpr auto begin() {

if constexpr (ForwardRange)

return outer_iterator<__SimpleView>{*this, ranges::begin(base_)};

else {

current_ = ranges::begin(base_);

return outer_iterator{*this};

}

}

constexpr auto begin() const requires ForwardRange && ForwardRange {

return outer_iterator{*this, ranges::begin(base_)};

}

constexpr auto end() requires ForwardRange && CommonRange {

return outer_iterator<__SimpleView>{*this, ranges::end(base_)};

}

constexpr auto end() const {

if constexpr (ForwardRange && ForwardRange && CommonRange)

return outer_iterator{*this, ranges::end(base_)};

else

return default_sentinel;

}

};

template

split_view(R&&, P&&) -> split_view, all_view

>;

template

split_view(R&&, iter_value_t>)

-> split_view, single_view>>>;

}

类模板 std::ranges::split_view::outer_iterator

namespace std::ranges {

template

template

struct split_view::outer_iterator {

private:

using Parent = // 仅用于阐释

conditional_t;

using Base = // 仅用于阐释

conditional_t;

Parent* parent_ = nullptr; // 仅用于阐释

iterator_t current_ = // 仅用于阐释,

iterator_t(); // 仅当 V 构成 ForwardRange 时才存在

public:

using iterator_concept =

conditional_t, forward_iterator_tag, input_iterator_tag>;

using iterator_category = input_iterator_tag;

struct value_type;

using difference_type = iter_difference_t>;

outer_iterator() = default;

constexpr explicit outer_iterator(Parent& parent)

requires (!ForwardRange);

constexpr outer_iterator(Parent& parent, iterator_t current)

requires ForwardRange;

constexpr outer_iterator(outer_iterator i)

requires Const && ConvertibleTo, iterator_t>;

constexpr value_type operator*() const;

constexpr outer_iterator& operator++();

constexpr decltype(auto) operator++(int) {

if constexpr (ForwardRange) {

auto tmp = *this;

++*this;

return tmp;

} else

++*this;

}

friend constexpr bool operator==(const outer_iterator& x, const outer_iterator& y)

requires ForwardRange;

friend constexpr bool operator!=(const outer_iterator& x, const outer_iterator& y)

requires ForwardRange;

friend constexpr bool operator==(const outer_iterator& x, default_sentinel_t);

friend constexpr bool operator==(default_sentinel_t, const outer_iterator& x);

friend constexpr bool operator!=(const outer_iterator& x, default_sentinel_t y);

friend constexpr bool operator!=(default_sentinel_t y, const outer_iterator& x);

};

}

类 std::ranges::split_view::outer_iterator::value_type

namespace std::ranges {

template

template

struct split_view::outer_iterator::value_type {

private:

outer_iterator i_ = outer_iterator(); // 仅用于阐释

public:

value_type() = default;

constexpr explicit value_type(outer_iterator i);

constexpr inner_iterator begin() const;

constexpr default_sentinel_t end() const;

};

}

类模板 std::ranges::split_view::inner_iterator

namespace std::ranges {

template

template

struct split_view::inner_iterator {

private:

using Base =

conditional_t; // 仅用于阐释

outer_iterator i_ = outer_iterator(); // 仅用于阐释

bool incremented_ = false; // 仅用于阐释

public:

using iterator_concept = typename outer_iterator::iterator_concept;

using iterator_category = /* 见定义 */;

using value_type = iter_value_t>;

using difference_type = iter_difference_t>;

inner_iterator() = default;

constexpr explicit inner_iterator(outer_iterator i);

constexpr decltype(auto) operator*() const { return *i_.current; }

constexpr inner_iterator& operator++();

constexpr decltype(auto) operator++(int) {

if constexpr (ForwardRange) {

auto tmp = *this;

++*this;

return tmp;

} else

++*this;

}

friend constexpr bool operator==(const inner_iterator& x, const inner_iterator& y)

requires ForwardRange;

friend constexpr bool operator!=(const inner_iterator& x, const inner_iterator& y)

requires ForwardRange;

friend constexpr bool operator==(const inner_iterator& x, default_sentinel_t);

friend constexpr bool operator==(default_sentinel_t, const inner_iterator& x);

friend constexpr bool operator!=(const inner_iterator& x, default_sentinel_t y);

friend constexpr bool operator!=(default_sentinel_t y, const inner_iterator& x);

friend constexpr decltype(auto) iter_move(const inner_iterator& i)

noexcept(noexcept(ranges::iter_move(i.i_.current))) {

return ranges::iter_move(i.i_.current);

}

friend constexpr void iter_swap(const inner_iterator& x, const inner_iterator& y)

noexcept(noexcept(ranges::iter_swap(x.i_.current, y.i_.current)))

requires IndirectlySwappable>;

};

}

类模板 std::ranges::common_view

namespace std::ranges {

template

requires (!CommonRange)

class common_view : public view_interface> {

private:

V base_ = V(); // 仅用于阐释

public:

common_view() = default;

constexpr explicit common_view(V r);

template

requires (!CommonRange && Constructible>)

constexpr explicit common_view(R&& r);

constexpr V base() const;

constexpr auto size() requires SizedRange {

return ranges::size(base_);

}

constexpr auto size() const requires SizedRange {

return ranges::size(base_);

}

constexpr auto begin() {

if constexpr (RandomAccessRange && SizedRange)

return ranges::begin(base_);

else

return common_iterator, sentinel_t>(ranges::begin(base_));

}

constexpr auto begin() const requires Range {

if constexpr (RandomAccessRange && SizedRange)

return ranges::begin(base_);

else

return

common_iterator, sentinel_t>(ranges::begin(base_));

}

constexpr auto end() {

if constexpr (RandomAccessRange && SizedRange)

return ranges::begin(base_) + ranges::size(base_);

else

return common_iterator, sentinel_t>(ranges::end(base_));

}

constexpr auto end() const requires Range {

if constexpr (RandomAccessRange && SizedRange)

return ranges::begin(base_) + ranges::size(base_);

else

return

common_iterator, sentinel_t>(ranges::end(base_));

}

};

template

common_view(R&&) -> common_view>;

}

类模板 std::ranges::reverse_view

namespace std::ranges {

template

requires BidirectionalRange

class reverse_view : public view_interface> {

private:

V base_ = V(); // 仅用于阐释

public:

reverse_view() = default;

constexpr explicit reverse_view(V r);

template

requires BidirectionalRange && Constructible>

constexpr explicit reverse_view(R&& r);

constexpr V base() const;

constexpr reverse_iterator> begin();

constexpr reverse_iterator> begin() requires CommonRange;

constexpr reverse_iterator> begin() const

requires CommonRange;

constexpr reverse_iterator> end();

constexpr reverse_iterator> end() const

requires CommonRange;

constexpr auto size() requires SizedRange {

return ranges::size(base_);

}

constexpr auto size() const requires SizedRange {

return ranges::size(base_);

}

};

template

reverse_view(R&&) -> reverse_view>;

}

相关文章

有关反的成语,包含反的成语
365bet即时比分

有关反的成语,包含反的成语

⌛ 08-15 💥 7788
4月18日体验服不停机更新公告
365bet即时比分

4月18日体验服不停机更新公告

⌛ 07-20 💥 9052
手机学会计的app排行榜TOP10推荐
365bet稳定备用网站

手机学会计的app排行榜TOP10推荐

⌛ 09-09 💥 1214