• Class / Function / Type

      std::
    • Header file

      <>
    • Other / All

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

    履歴 編集

    function template
    <algorithm>

    std::generate

    namespace std {
      template <class ForwardIterator, class Generator>
      void generate(ForwardIterator first,
                    ForwardIterator last,
                    Generator gen);                  // (1) C++03
    
      template <class ForwardIterator, class Generator>
      constexpr void generate(ForwardIterator first,
                              ForwardIterator last,
                              Generator gen);        // (1) C++20
    
      template <class ExecutionPolicy, class ForwardIterator, class Generator>
      void generate(ExecutionPolicy&& exec,
                    ForwardIterator first,
                    ForwardIterator last,
                    Generator gen);                  // (2) C++17
    }
    

    概要

    イテレータ範囲[first, last)に、引数なしの関数genの結果を書き込む。

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

    • gen は引数をとらないこと

    効果

    イテレータ範囲[first,last) のそれぞれのイテレータについて関数オブジェクト gen を呼び出し、その戻り値を代入する。

    計算量

    正確に last - first 回の gen の呼び出しと代入が行われる。

    #include <algorithm>
    #include <iostream>
    #include <vector>
    
    int main() {
      std::vector<int> v(10);
    
      // 2 の累乗の値を生成する
      int n = 1;
      std::generate(v.begin(), v.end(), [&n]() { auto t = n; n *= 2; return t; });
    
      std::for_each(v.begin(), v.end(), [](int x) { std::cout << x << ","; });
    }
    

    出力

    1,2,4,8,16,32,64,128,256,512,
    

    実装例

    template <class ForwardIterator, class Generator>
    void generate(ForwardIterator first, ForwardIterator last, Generator gen) {
      while (first != last)
        *first++ = gen();
    }
    

    参照