- algorithm[meta header]
- std[meta namespace]
- function template[meta id-type]
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
}
出力の範囲へ関数の結果を n
個書き込む。
gen
は引数をとらないこと。Size
は integral type に変換可能であること。
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; });
}
- std::generate_n[color ff0000]
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:
- GCC, C++11 mode:
- ICC:
- Visual C++: 2005, 2008, 2010, 2012, 2013, 2015
- C++11への対応(戻り値の変更)は2012から。