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から。