名前空間
変種
操作

std::ranges::views::iota, std::ranges::iota_view

From cppreference.com
< cpp‎ | ranges
 
 
Rangesライブラリ
Rangeアダプタ
 
 
ヘッダ <ranges> で定義
template< std::weakly_incrementable W,

          std::semiregular Bound = std::unreachable_sentinel_t >
    requires /*weakly-equality-comparable-with*/<W, Bound> && std::copyable<W>
class iota_view

    : public ranges::view_interface<iota_view<W, Bound>>
(1) (C++20以降)
namespace views {

    inline constexpr /* unspecified */ iota = /* unspecified */;

}
(2) (C++20以降)
呼び出しシグネチャ
template< class W >

    requires /* 以下を参照 */

constexpr /* see below */ iota( W&& value );
(C++20以降)
template< class W, class Bound >

    requires /* 以下を参照 */

constexpr /* see below */ iota( W&& value, Bound&& bound );
(C++20以降)
1) 初期値を繰り返しインクリメントして要素のシーケンスを生成するレンジファクトリ。有界または無限(無界)にすることができます。
2) views::iota(e) および views::iota(e, f) は、任意の適切なサブ式 e および f に対して、それぞれ iota_view<std::decay_t<decltype((e))>>(e) および iota_view(e, f)式同値です。

目次

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

views::iota という名前は、関数オブジェクトであり、リテラルsemiregular クラス型の const のカスタマイズポイントオブジェクトを指します。説明のために、その型の cv 修飾されていないバージョンを __iota_fn と表記します。

__iota_fn のすべてのインスタンスは等価です。型 __iota_fn の異なるインスタンスを同じ引数で呼び出す効果は、インスタンスを表す式が lvalue であるか rvalue であるか、また const 修飾されているか否かに関わらず同等です(ただし、volatile 修飾されたインスタンスの呼び出しは保証されません)。したがって、views::iota は自由にコピーでき、そのコピーは相互に交換可能です。

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

それ以外の場合、__iota_fn の関数呼び出し演算子はオーバーロード解決に参加しません。

[編集] データメンバ

メンバ 定義
W value_ 開始値
(説明用のメンバオブジェクト*)
Bound bound_ 終端値、到達不能な場合があります。
(説明用のメンバオブジェクト*)

[編集] メンバ関数

iota_view を作成します。
(public member function)
iota_view の開始イテレータを取得します。
(public member function)
iota_view の終端を示すセンチネルを取得します。
(public member function)
iota_view が空かどうかをテストします(つまり、イテレータとセンチネルが等しいかどうか)。
(public member function)
(オプション)
iota_view のサイズを取得します(有界の場合のみ提供されます)。
(public member function)
std::ranges::view_interface から継承
(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 メンバ関数) [編集]

[編集] 推論ガイド

[編集] ネストされたクラス

イテレータ型
(説明専用メンバクラス*)
iota_view が有界で、BoundW が異なる型の場合に使用されるセンチネル型。
(説明専用メンバクラス*)

[編集] ヘルパーテンプレート

template< std::weakly_incrementable W, std::semiregular Bound >
constexpr bool ranges::enable_borrowed_range<ranges::iota_view<W, Bound>> = true;
(C++20以降)

この ranges::enable_borrowed_range の特殊化により、iota_viewborrowed_range を満たします。

[編集]

#include <algorithm>
#include <iostream>
#include <ranges>
 
struct Bound
{
    int bound;
    bool operator==(int x) const { return x == bound; }
};
 
int main()
{
    for (int i : std::ranges::iota_view{1, 10})
        std::cout << i << ' ';
    std::cout << '\n';
 
    for (int i : std::views::iota(1, 10))
        std::cout << i << ' ';
    std::cout << '\n';
 
    for (int i : std::views::iota(1, Bound{10}))
        std::cout << i << ' ';
    std::cout << '\n';
 
    for (int i : std::views::iota(1) | std::views::take(9))
        std::cout << i << ' ';
    std::cout << '\n';
 
    std::ranges::for_each(std::views::iota(1, 10),
                          [](int i){ std::cout << i << ' '; });
    std::cout << '\n';
}

出力

1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9

[編集] 不具合報告

以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。

DR 適用対象 公開された動作 正しい動作
LWG 4096 C++20 views::iotaiota_view をそのままコピーできた 禁止
P2325R3 C++20 iota_viewWsemiregular であることを要求していた
viewdefault_initializable を要求するため
Wcopyable であることのみを要求する

[編集] 関連項目

(C++11)
開始値からの連続した増分値で範囲を埋める
(関数テンプレート) [編集]
開始値からの連続した増分値で範囲を埋める
(アルゴリズム関数オブジェクト)[編集]
同じ値を繰り返し生成することで得られるシーケンスからなる view
(クラステンプレート) (カスタマイゼーションポイントオブジェクト)[編集]
English 日本語 中文(简体) 中文(繁體)