std::generate_n
ja.cppreference.net より
| ヘッダ <algorithm>
|
||
template< class OutputIt, class Size, class Generator >
OutputIt generate_n( OutputIt first, Size count, Generator g );
|
(1) | (C++20 から constexpr) |
template< class ExecutionPolicy,
class ForwardIt, class Size, class Generator >
ForwardIt generate_n( ExecutionPolicy&& policy,
ForwardIt first, Size count, Generator g );
|
(2) | (C++17 から) |
1) 関数オブジェクト
g によって生成された値を、count 個の要素 (先頭は first) に代入する。ただし count > 0 の場合。そうでなければ何もしない。2) (1) と同じだが、 に従って実行される。 このオーバーロードは、次の式の値が
policy である場合にのみオーバーロード解決に参加する: true(C++20 まで)|
|
(C++20 から) |
|
|
もし |
が Size整数型に変換可能でなければ、プログラムは不適格となる。
目次
first
| - | 生成する要素の範囲の先頭 | count | ||||||
| - | 生成する要素の数 | policy | ||||||
| - | 使用する | 実行ポリシー g | ||||||
| - | 呼び出されるジェネレータ関数オブジェクト。 | 関数のシグネチャは以下と同等であるべき:
型
は、 | ||||||
| - | ||||||||
は OutputItLegacyOutputIterator の要件を満たす必要がある。
- | ||||||||
は ForwardItLegacyForwardIterator の要件を満たす必要がある。
戻り値 | ||||||||
の場合は代入された最後の要素の次のイテレータ、count > 0 の場合は first。
計算量
厳密に std::max(0, count) 回の g() の呼び出しと代入。
例外
テンプレートパラメータ ExecutionPolicy を持つオーバーロードは次のようにエラーを報告する:
- アルゴリズムの一部として呼び出された関数の実行が例外を投げ、
ExecutionPolicyが標準ポリシーの1つである場合、std::terminate が呼ばれる。他のExecutionPolicyについては、動作は処理系定義である。 - アルゴリズムがメモリの確保に失敗した場合、std::bad_alloc が投げられる。
実装例
template<class OutputIt, class Size, class Generator>
constexpr // since C++20
OutputIt generate_n(OutputIt first, Size count, Generator g)
{
for (Size i = 0; i < count; ++i, ++first)
*first = g();
return first;
}
|
例
このコードを実行
#include <algorithm>
#include <functional>
#include <iostream>
#include <iterator>
#include <random>
int main()
{
std::mt19937 rng; // default constructed, seeded with fixed seed
std::generate_n(std::ostream_iterator<std::mt19937::result_type>(std::cout, " "),
5, std::ref(rng));
std::cout << '\n';
}
出力:
3499211612 581869302 3890346734 3586334585 545404204
欠陥報告
以下の動作を変更する欠陥報告は、以前に公開されたC++標準に遡って適用された。
| DR | 適用先 | 公開時の動作 | 正しい動作 |
|---|---|---|---|
| LWG 426 | C++98 | 計算量の要件が「厳密に count 回の呼び出しまたは代入」であったが、 count が負の場合に不適切
|
が非正の場合は呼び出しも代入も行わない countLWG 865 |
| C++98 | 生成範囲の次の最初の要素の位置が | 返されていなかった |
返されるように |
関連項目
| 指定された値を範囲内の N 個の要素にコピー代入する (関数テンプレート & アルゴリズム関数オブジェクト) | |
(C++20) |
|
| 連続する関数呼び出しの結果を範囲内の全ての要素に代入する (関数テンプレート & アルゴリズム関数オブジェクト) | |
(C++20) |
|
(C++20) |
関数の N 回の適用結果を保存する (アルゴリズム関数オブジェクト) |