命名空间
变体
操作

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

来自 cppreference.com
< 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) (自 C++23 起)
namespace views {

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

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

    requires /* see below */

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

    requires /* see below */

constexpr /* see below */ repeat( W&& value, Bound&& bound );
(自 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 类类型的常量 函数对象。为了说明目的,其类型的 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 的大小(如果其大小已确定)
(公共成员函数)
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) (自 C++23 起)
constexpr explicit repeat_view( const W& value, Bound bound = Bound() );
(2) (自 C++23 起)
constexpr explicit repeat_view( W&& value, Bound bound = Bound() );
(3) (自 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) (自 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;
(自 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) (自 C++23 起)
constexpr std::unreachable_sentinel_t end() const;
(2) (自 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>);
(自 C++23 起)

返回 to-unsigned-like (bound_ ).

[编辑] 推导指南

template< class W, class Bound = std::unreachable_sentinel_t >
repeat_view( W, Bound = Bound() ) -> repeat_view<W, Bound>;
(自 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 使用 repeat_view 调用 views::repeat
没有创建嵌套的 repeat_view
创建嵌套的
repeat_view

[编辑] 另请参阅

一个 view,由重复递增初始值生成的序列组成
(类模板) (定制点对象)[编辑]