命名空间
变体
操作

std::ranges::views::repeat, std::ranges::repeat_view

来自 cppreference.cn
< cpp‎ | ranges
 
 
范围库
范围适配器
 
 
定义于头文件 <ranges>
template< std::move_constructible W,

          std::semiregular Bound = std::unreachable_sentinel_t >
    requires (std::is_object_v<W> && std::same_as<W, std::remove_cv_t<W>> &&
             (/*integer-like-with-usable-difference-type*/<Bound> ||
              std::same_as<Bound, std::unreachable_sentinel_t>))

class repeat_view : public ranges::view_interface<repeat_view<W, Bound>>
(1) (since C++23)
namespace views {

    inline constexpr /* unspecified */ repeat = /* unspecified */;

}
(2) (since C++23)
调用签名
template< class W >

    requires /* see below */

constexpr /* see below */ repeat( W&& value );
(since C++23)
template< class W, class Bound >

    requires /* see below */

constexpr /* see below */ repeat( W&& value, Bound&& bound );
(since C++23)
辅助概念
concept /*integer-like-with-usable-difference-type*/ =

    /*is-signed-integer-like*/<T> ||

    (/*is-integer-like*/ <T> && std::weakly_incrementable<T>)
(3) (仅为阐述目的*)
1) 一个范围工厂,通过重复生成相同的值来生成元素序列。可以是有限的或无限的(无限的)。
2) views::repeat(e)views::repeat(e, f) 分别与 表达式等价repeat_view<std::decay_t<decltype((E))>>(e)repeat_view(e, f) ,对于任何合适的子表达式 ef
3) 确定类型是否为整数类型且具有可用的差值类型。

repeat_view 建模 random_access_range。如果 Bound 不是 std::unreachable_sentinel_t,则 repeat_view 也建模 sized_rangecommon_range

内容

自定义点对象

名称 views::repeat 表示一个自定义点对象,它是一个字面 semiregular 类类型的 const 函数对象。为了阐述目的,其类型的 cv-非限定版本表示为 __repeat_fn。

__repeat_fn 的所有实例都相等。在相同参数上调用 __repeat_fn 类型的不同实例的效果是等效的,无论表示实例的表达式是左值还是右值,以及是否是 const 限定的(但是,不要求 volatile 限定的实例可调用)。因此,views::repeat 可以自由复制,并且其副本可以互换使用。

给定一组类型 Args...,如果 std::declval<Args>()... 满足上述 views::repeat 参数的要求,则 __repeat_fn 建模

否则,__repeat_fn 的任何函数调用运算符都不参与重载解析。

[编辑] 数据成员

成员 定义
movable-box <W> value_ 视图的重复元素
(仅为阐述目的的成员对象*)
Bound bound_ 哨兵值
(仅为阐述目的的成员对象*)

[编辑] 成员函数

创建一个 repeat_view
(公共成员函数)
获取 repeat_view 的起始迭代器
(公共成员函数)
获取表示 repeat_view 结尾的哨兵
(公共成员函数)
如果 repeat_view 是 sized,则获取其大小
(公共成员函数)
继承自 std::ranges::view_interface
返回派生视图是否为空,仅当其满足 sized_rangeforward_range 时提供
(std::ranges::view_interface<D> 的公共成员函数) [编辑]
(C++23)
返回范围起始位置的常量迭代器
(std::ranges::view_interface<D> 的公共成员函数) [编辑]
(C++23)
返回范围常量迭代器的哨兵
(std::ranges::view_interface<D> 的公共成员函数) [编辑]
返回派生视图是否非空,仅当 ranges::empty 适用于它时提供
(std::ranges::view_interface<D> 的公共成员函数) [编辑]
返回派生视图中的第一个元素,如果其满足 forward_range 则提供
(std::ranges::view_interface<D> 的公共成员函数) [编辑]
返回派生视图中的最后一个元素,仅当其满足 bidirectional_rangecommon_range 时提供
(std::ranges::view_interface<D> 的公共成员函数) [编辑]
返回派生视图中的第 n 个元素,仅当其满足 random_access_range 时提供
(std::ranges::view_interface<D> 的公共成员函数) [编辑]

std::ranges::repeat_view::repeat_view

repeat_view() requires std::default_initializable<W> = default;
(1) (since C++23)
constexpr explicit repeat_view( const W& value, Bound bound = Bound() );
(2) (since C++23)
constexpr explicit repeat_view( W&& value, Bound bound = Bound() );
(3) (since C++23)
template < class... WArgs, class... BoundArgs >

    requires std::constructible_from<W, WArgs...>
          && std::constructible_from<Bound, BoundArgs...>
constexpr explicit
    repeat( std::piecewise_construct_t, std::tuple<WArgs...> value_args,

            std::tuple<BoundArgs...> bound_args = std::tuple<>{} );
(4) (since C++23)
1) 默认初始化 value_ 并值初始化 bound_ 。
2) 使用 value_ 初始化 value,并使用 bound_ 初始化 bound
如果 Bound 不是 std::unreachable_sentinel_tbool(bound >= 0)false,则行为未定义。
3) 使用 std::move(value) 初始化 value_,并使用 bound 初始化 bound_
如果 Bound 不是 std::unreachable_sentinel_tbool(bound >= 0)false,则行为未定义。
4) 使用 std::make_from_tuple<T>(std::move(value_args)) 初始化 value_,并使用 std::make_from_tuple<Bound>(std::move(bound_args)) 初始化 bound_
如果 Bound 不是 std::unreachable_sentinel_tbool(bound >= 0)false,则行为未定义。

参数

value - 要重复生成的值
bound - 边界
value_args - 包含 value_ 初始化器的元组
bound_args - 包含 bound_ 初始化器的元组

std::ranges::repeat_view::begin

constexpr /*iterator*/ begin() const;
(since C++23)

返回 iterator (std::addressof(*value_ ))

std::ranges::repeat_view::end

constexpr /*iterator*/ end() const
    requires (!std::same_as<Bound, std::unreachable_sentinel_t>);
(1) (since C++23)
constexpr std::unreachable_sentinel_t end() const;
(2) (since C++23)
1) 返回 iterator (std::addressof(*value_ ), bound_ )

std::ranges::repeat_view::size

constexpr auto size() const
    requires (!std::same_as<Bound, std::unreachable_sentinel_t>);
(since C++23)

返回 to-unsigned-like (bound_ )

[编辑] 推导指引

template< class W, class Bound = std::unreachable_sentinel_t >
repeat_view( W, Bound = Bound() ) -> repeat_view<W, Bound>;
(since C++23)

[编辑] 嵌套类

迭代器类型
(仅为阐述目的的成员类*)

[编辑] 注释

特性测试 Std 特性
__cpp_lib_ranges_repeat 202207L (C++23) std::ranges::repeat_view

[编辑] 示例

#include <iostream>
#include <ranges>
#include <string_view>
using namespace std::literals;
 
int main()
{
    // bounded overload
    for (auto s : std::views::repeat("C++"sv, 3))
        std::cout << s << ' ';
    std::cout << '\n';
 
    // unbounded overload
    for (auto s : std::views::repeat("I know that you know that"sv)
                | std::views::take(3))
        std::cout << s << ' ';
    std::cout << "...\n";
}

输出

C++ C++ C++
I know that you know that I know that you know that I know that you know that ...

[编辑] 缺陷报告

以下行为变更缺陷报告被追溯应用于先前发布的 C++ 标准。

DR 应用于 已发布行为 正确行为
LWG 4053 C++20 views::repeat 的一元调用未衰减参数 衰减参数
LWG 4054 C++20 使用 views::repeat 调用 repeat_view
未创建嵌套的 repeat_view
创建嵌套的
repeat_view

[编辑] 参见

一个视图,由通过重复递增初始值生成的序列组成
(类模板) (自定义点对象)[编辑]