• Class / Function / Type

      std::
    • Header file

      <>
    • Other / All

    最終更新日時(UTC):
    が更新

    履歴 編集

    class template
    <ranges>

    std::ranges::iota_view

    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)

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

    効果

    • 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

    処理系

    関連項目

    参照