名前空間
変種
操作

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

From cppreference.com
< cpp‎ | ranges
 
 
Rangesライブラリ
Rangeアダプタ
 
 
ヘッダ <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 /* 以下を参照 */

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

    requires /* 以下を参照 */

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) は、適切な部分式 ef に対して、それぞれ repeat_view<std::decay_t<decltype((E))>>(e)repeat_view(e, f)式的に等価です。
3) 型が整数ライクであり、使用可能な差分型を持っているかどうかを判定します。

repeat_viewrandom_access_range をモデル化します。もし Boundstd::unreachable_sentinel_t でない場合、repeat_viewsized_range および common_range もモデル化します。

目次

カスタマイゼーションポイントオブジェクト

views::repeat という名前は、const リテラル semiregular クラス型の関数オブジェクトであるカスタマイゼーションポイントオブジェクトを指します。説明のために、その型のcv非限定バージョンは__repeat_fnと表記されます。

__repeat_fn のすべてのインスタンスは等価です。異なる型の __repeat_fn のインスタンスを同じ引数で呼び出した場合の効果は、そのインスタンスを表す式がl値かr値か、const修飾されているかどうかにかかわらず等価です(ただし、volatile修飾されたインスタンスは呼び出し可能である必要はありません)。したがって、views::repeat は自由にコピーでき、そのコピーは互換的に使用できます。

型のセット Args... が与えられたとき、std::declval<Args>()... が上記の views::repeat の引数の要件を満たしている場合、__repeat_fn は以下をモデル化します。

そうでなければ、__repeat_fn の関数呼び出し演算子はオーバーロード解決に参加しません。

[編集] データメンバー

メンバ 定義
movable-box <W> value_ ビューの繰り返し要素
(説明用のメンバオブジェクト*)
Bound bound_ 番兵値
(説明用のメンバオブジェクト*)

[編集] メンバ関数

repeat_view を作成します。
(public member function)
repeat_view の開始イテレータを取得します。
(public member function)
repeat_view の末尾を示す番兵を取得します。
(public member function)
repeat_view がサイズを持つ場合、そのサイズを取得します。
(public member function)
std::ranges::view_interface から継承
派生ビューが空かどうかを返す。sized_range または forward_range を満たす場合にのみ提供される
(std::ranges::view_interface<D> の public メンバ関数) [編集]
(C++23)
範囲の先頭への定数イテレータを返す
(std::ranges::view_interface<D> の public メンバ関数) [編集]
(C++23)
範囲の定数イテレータの番兵を返す
(std::ranges::view_interface<D> の public メンバ関数) [編集]
派生ビューが空でないかどうかを返す。ranges::empty が適用可能な場合にのみ提供される
(std::ranges::view_interface<D> の public メンバ関数) [編集]
派生ビューが forward_range を満たす場合に、派生ビューの最初の要素を返す
(std::ranges::view_interface<D> の public メンバ関数) [編集]
派生ビューが bidirectional_rangecommon_range の両方を満たす場合にのみ、派生ビューの最後の要素を返す
(std::ranges::view_interface<D> の public メンバ関数) [編集]
派生ビューが random_access_range を満たす場合にのみ、派生ビューの n番目の要素を返す
(std::ranges::view_interface<D> の public メンバ関数) [編集]

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 で初期化します。
Boundstd::unreachable_sentinel_t ではなく、bool(bound >= 0)false の場合、動作は未定義です。
3) value_std::move(value) で初期化し、bound_bound で初期化します。
Boundstd::unreachable_sentinel_t ではなく、bool(bound >= 0)false の場合、動作は未定義です。
4) value_std::make_from_tuple<T>(std::move(value_args)) で、bound_std::make_from_tuple<Bound>(std::move(bound_args)) で初期化します。
Boundstd::unreachable_sentinel_t ではなく、bool(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_ ) を返します。
2) std::unreachable_sentinel を返します。

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から)

[編集] 入れ子クラス

イテレータ型
(説明専用メンバクラス*)

[編集] 注釈

機能テストマクロ 規格 機能
__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
(クラステンプレート) (カスタマイゼーションポイントオブジェクト)[編集]
English 日本語 中文(简体) 中文(繁體)