• Class / Function / Type

      std::
    • Header file

      <>
    • Other / All

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

    履歴 編集

    function template
    <algorithm>

    std::generate_n

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

    概要

    イテレータ範囲[first, first + n) (範囲の先頭N要素) に関数genの結果を書き込む。

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

    • gen は引数をとらないこと。
    • Size は整数型に変換可能であること。

    効果

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

    そうでない場合、何もしない。

    戻り値

    • C++03 まで
      無し
    • C++11 から
      n が 1 以上の場合、first + n が返される。
      そうでない場合、first が返される。

    計算量

    n が 1 以上の場合、n 回の gen の呼び出しと代入が行われる。

    そうでない場合、何もしない。

    #include <algorithm>
    #include <iostream>
    #include <iterator>
    
    int main() {
      // 2 の累乗の値を生成して出力する
      int n = 1;
      std::generate_n(std::ostream_iterator<int>(std::cout, ","),
        10, [&n]{ auto t = n; n *= 2; return t; });
    }
    

    出力

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

    実装例

    template <class OutputIterator, class Size, class Generator>
    # if __cplusplus >= 201103L
    OutputIterator
    # else
    void
    # endif
    generate_n(OutputIterator first, Size n, Generator gen) {
      while (n-- > 0)
        *first++ = gen();
    # if __cplusplus >= 201103L
      return first;
    # endif
    }
    

    処理系

    参照