Namespaces
Variants

std::ranges::iota_view<W, Bound>::iota_view

ja.cppreference.net より
 
 
Ranges ライブラリ
Range アダプタ
 
 
iota_view() requires std::default_initializable<W> = default;
(1) (C++20 以降)
constexpr explicit iota_view( W value );
(2) (C++20 以降)
constexpr explicit iota_view( std::type_identity_t<W> value,
                              std::type_identity_t<Bound> bound );
(3) (C++20 以降)
constexpr explicit iota_view( /*iterator*/ first, /* see below */ last );
(4) (C++20 以降)

iota_view を構築します。

1) デフォルトコンストラクタ。 値初期化された内部の value_ および bound_ で初期化します。
2) value_ を value で初期化し、bound_ を値初期化します。
  • 以下の場合、動作は未定義です:
  • Bound が std::unreachable_sentinel_t ではなく、かつ Bound() が value から到達可能でない場合。
  • std::totally_ordered_with<W, Bound> がモデル化され、かつ bool(value <= Bound()) が false である場合。
3) value_ を value で初期化し、bound_ を bound で初期化します。
  • 以下の場合、動作は未定義です:
  • Bound が std::unreachable_sentinel_t ではなく、かつ bound が value から到達可能でない場合。
  • std::totally_ordered_with<W, Bound> がモデル化され、かつ bool(value <= bound) が false である場合。
4) value_ を W に格納されている first 値で初期化し、bound_ を Bound で表現される last 値(これは end() の型と同じ型を持ちます)で初期化します。
  • W と Bound が同じ型である場合、iota_view(first.value_, last.value_) と同等です。
  • そうでなく、Bound が std::unreachable_sentinel_t である場合、iota_view(first.value_, last) と同等です。
  • そうでない場合、iota_view(first.value_, last.bound_) と同等です。

パラメータ

value - 開始値
bound - 境界値
first - 開始値を示すイテレータ
last - 境界を示すイテレータまたは番兵

例

#include <cassert>
#include <iostream>
#include <iterator>
#include <ranges>
int main()
{
    const auto l = {1, 2, 3, 4};
    auto i1 = std::ranges::iota_view<int, int>(); // オーバーロード (1)
    assert(i1.empty() and i1.size() == 0);
    auto i2 = std::ranges::iota_view(1); // オーバーロード (2)
    assert(not i2.empty() and i2.front() == 1);
    for (std::cout << "1) "; auto e : i2 | std::views::take(3))
        std::cout << e << ' ';
    std::cout << '\n';
    auto i3 = std::ranges::iota_view(std::begin(l)); // オーバーロード (2)
    assert(not i3.empty() and i3.front() == l.begin());
    for (std::cout << "2) "; auto e : i3 | std::views::take(4))
        std::cout << *e << ' ';
    std::cout << '\n';
    auto i4 = std::ranges::iota_view(1, 8); // オーバーロード (3)
    assert(not i4.empty() and i4.front() == 1 and i4.back() == 7);
    for (std::cout << "3) "; auto e : i4)
        std::cout << e << ' ';
    std::cout << '\n';
    auto i5 = std::ranges::iota_view(l.begin(), l.end()); // オーバーロード (4)
    for (std::cout << "4) "; auto e : i5)
        std::cout << *e << ' ';
    std::cout << '\n';
    auto i6 = std::ranges::iota_view(l.begin(), std::unreachable_sentinel); // (4)
    for (std::cout << "5) "; auto e : i6 | std::views::take(3))
        std::cout << *e << ' ';
    std::cout << '\n';
}

出力:

1) 1 2 3
2) 1 2 3 4
3) 1 2 3 4 5 6 7
4) 1 2 3 4
5) 1 2 3

不具合報告

以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。

DR 適用対象 公開時の動作 正しい動作
LWG 3523 C++20 オーバーロード (4) が誤ったセンチネル型を使用する可能性あり 修正済み
P2711R1 C++20 オーバーロード (3,4) が明示的ではなかった 明示的に変更