最終更新日時(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
}

処理系

  • Clang:
  • GCC:
  • ICC:
  • Visual C++: 2005 , 2008 , 2010 , 2012 , 2013 , 2015
    • C++11への対応(戻り値の変更)は2012から。

参照