std::generate_n
From cppreference.com
| ヘッダー <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 > |
(2) | (C++17以降) |
1) 関数オブジェクト g によって生成された値を、count > 0 の場合、first から始まる範囲の最初の count 要素に代入します。そうでない場合は何も行いません。
2) (1) と同じですが、policy に従って実行されます。
このオーバーロードは、以下のすべての条件が満たされた場合にのみオーバーロード解決に参加します。
|
std::is_execution_policy_v<std::decay_t<ExecutionPolicy>> は true です。 |
(C++20まで) |
|
std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>> は true です。 |
(C++20以降) |
Size が 変換可能な 整数型でない場合、プログラムは不正形式となります。
目次 |
[編集] パラメータ
| first | - | 生成する要素の範囲の開始 | ||||||
| count | - | 生成する要素の数 | ||||||
| policy | - | 使用する 実行ポリシー | ||||||
| g | - | 呼び出されるジェネレータ関数オブジェクト。 関数のシグネチャは以下と同等である必要があります。
Ret の型は、OutputIt 型のオブジェクトを逆参照して Ret 型の値に代入できる必要があります。 | ||||||
| 型要件 | ||||||||
-OutputIt は LegacyOutputIterator の要件を満たさなければなりません。 | ||||||||
-ForwardIt は LegacyForwardIterator の要件を満たさなければなりません。 | ||||||||
[編集] 戻り値
count > 0 の場合、代入された最後の要素の次のイテレータ。それ以外の場合は first。
[編集] 計算量
std::max(0, count) 回の g() の呼び出しと代入。
[編集] 例外
テンプレートパラメータ ExecutionPolicy を持つオーバーロードは、次のようにエラーを報告します。
- アルゴリズムの一部として呼び出された関数の実行が例外をスローし、
ExecutionPolicyが 標準ポリシー のいずれかである場合、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 が負の場合は不正でした。 |
呼び出しも代入もなし count が非正の場合 |
| LWG 865 | C++98 | 代入範囲の次の要素の位置 生成範囲が返されていませんでした。 |
返されます |
[編集] 関連項目
| 範囲内のN個の要素に指定された値をコピー代入する (関数テンプレート) | |
| 範囲内のすべての要素に連続する関数呼び出しの結果を代入する (関数テンプレート) | |
| (C++20) |
関数のN回の適用の結果を保存する (アルゴリズム関数オブジェクト) |