最終更新日時: 2025年07月12日 02時16分44秒 (JST)
Koichi Murase が更新

履歴 編集

class template
<ranges>

# std::ranges::iota_view(C++20)

    namespace std::ranges {
      template<weakly_incrementable W, semiregular Bound = unreachable_sentinel_t>
        requires weakly-equality-comparable-with<W, Bound> && copyable<W>
      class iota_view : public view_interface<iota_view<W, Bound>> { …… }; // (1)

      namespace views {
        inline constexpr unspecified iota = unspecified; // (2)
      }
    }

## 概要

- (1): インクリメント演算子によって生成される、有限長または無限長の単調増加列を表す`view`
  - 1つの値`b`から生成した`iota_view`は、`b`から始まる無限長の単調増加列となる。
  - 2つの値`b`, `e`から生成した`iota_view`は、`[b, e)`に含まれる値を列挙する有限長の単調増加列となる。
- (2): `iota_view`を生成するカスタマイゼーションポイントオブジェクト

`iota_view`の要素は、`iota_view`が作られる時に初めの要素が生成され、残りはアクセスするときに生成される。

### Rangeコンセプト

borrowed | sized | output | input | forward | bidirectional | random_access | contiguous | common | viewable | view
--- | --- | --- | --- | --- | --- | --- | --- | --- | --- | ---
○ | (1) |  | ○ | (2) | (2) | (2) |  | (3) | ○ | ○

- (1): `common_range`かつ`random_access_range`のとき
- (2):
  - `W`が`incrementable`のとき、`forward_range`
  - `W`が`incrementable`かつデクリメント操作が可能であるとき、`bidirectional_range`
  - `W`が`incrementable`かつデクリメント操作と加減算が可能であるとき、`random_access_range`
- (3): `W`と`Bound`が等しいとき

## テンプレートパラメータ制約

- `weakly_incrementable<W>`
- `copyable<W>`
- `semiregular<Bound>`
- `weakly-equality-comparable-with<W, Bound>`

## 効果

- 式`views::iota(E)`の効果は`iota_view(E)`と等しい。
- 式`views::iota(E, F)`の効果は`iota_view(E, F)`と等しい。

## メンバ関数

名前 | 説明 | 対応バージョン
--- | --- | ---
`(constructor)` | コンストラクタ | C++20
`begin` | 先頭を指すイテレータを取得する | C++20
`end` | 番兵を取得する | C++20
`size` | 有限長のとき、要素数を取得する | C++20
`empty` | Rangeが空かどうかを判定する | C++26

## 継承しているメンバ関数

名前 | 説明 | 対応バージョン
--- | --- | ---
`empty` | Rangeが空かどうかを判定する | C++20（C++23まで）
`operator bool` | Rangeが空でないかどうかを判定する | C++20
`front` | 先頭要素への参照を取得する | C++20
`back` | 有限長のとき、末尾要素への参照を取得する | C++20
`operator[]` | 要素へアクセスする | C++20

## メンバ型

名前 | 説明 | 対応バージョン
--- | --- | ---
`iterator` | イテレータ型(説明専用) | C++20
`sentinel` | 番兵型(説明専用) | C++20

## その他

名前 | 説明 | 対応バージョン
--- | --- | ---
`iota_diff_t` | イテレータの差の型(説明専用) | C++20

## 推論補助

名前 | 説明 | 対応バージョン
--- | --- | ---
`(deduction_guide)` | クラステンプレートの推論補助 | C++20

## 例

    #include <ranges>
    #include <iostream>

    int main() {
      using namespace std;

      for (int i : views::iota(1, 10)) {
        cout << i;
      }
      cout << '\n';
      for (int i : views::iota(1) | views::filter([](auto&& x) { return x % 3 == 0; }) | views::take(3)) {
        cout << i;
      }
    }

### 出力

    123456789
    369

## 例 自作クラスを使用する

    #include <ranges>
    #include <concepts>
    #include <cstdint>
    #include <iostream>

    struct fizzbuzz_t {
      int value_ = 0;
      constexpr fizzbuzz_t& operator++(){
        ++value_;
        return *this;
      }
      constexpr fizzbuzz_t operator++(int){
        ++value_;
        return {value_ - 1};
      }
      using difference_type = int;
      constexpr auto operator<=>(const fizzbuzz_t&) const = default;
    };

    static_assert(std::weakly_incrementable<fizzbuzz_t>);

    std::ostream& operator<<(std::ostream& os, fizzbuzz_t fb) {
      if(fb.value_ % 15 == 0) {
        return os << "FizzBuzz";
      }
      if(fb.value_ % 3 == 0) {
        return os << "Fizz";
      }
      if(fb.value_ % 5 == 0) {
        return os << "Buzz";
      }
      return os << fb.value_;
    }

    int main()
    {
      for(auto fb : std::views::iota(fizzbuzz_t{1}, fizzbuzz_t{16})) {
        std::cout << fb << '\n';
      }
    }

### 出力

    1
    2
    Fizz
    4
    Buzz
    Fizz
    7
    8
    Fizz
    Buzz
    11
    Fizz
    13
    14
    FizzBuzz

## バージョン

### 言語

- C++20

### 処理系

- Clang: 13.0.0 ✅
- GCC: 10.1.0 ✅
- ICC: ?
- Visual C++: 2019 Update 10 ✅

## 関連項目

- `std::iota`, `std::ranges::iota`: Rangeに先行評価で増加列を書き込む標準アルゴリズム関数

## 参照

- N4861 24 Ranges library
- C++20 ranges
- P2325R3 Views should not be required to be default constructible (本提案文書はC++20に遡って適用されている)
- P2367R0 Remove misuses of list-initialization from Clause 24 (本提案文書はC++20に遡って適用されている)
- LWG Issue 4001. `iota_view` should provide `empty`