Namespaces
Variants

std::generate_n

ja.cppreference.net より
 
 
アルゴリズムライブラリ
制約付きアルゴリズムとレンジ上のアルゴリズム (C++20)
制約付きアルゴリズム (例: ranges::copy, ranges::sort, ...)
ソートと関連操作
分割操作
(C++11)    

ソート操作
二分探索操作
(分割範囲に対する)
集合操作 (ソート済み範囲に対する)
マージ操作 (ソート済み範囲に対する)
ヒープ操作
最小/最大操作
(C++11)
(C++17)
辞書式比較操作
順列操作


 
ヘッダ <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 まで)

std::is_execution_policy_v<std::decay_t<ExecutionPolicy>>

(C++20 から)

std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>>

もし

が Size整数型に変換可能でなければ、プログラムは不適格となる。 目次

first

- 生成する要素の範囲の先頭 count
- 生成する要素の数 policy
- 使用する 実行ポリシー g
- 呼び出されるジェネレータ関数オブジェクト。 関数のシグネチャは以下と同等であるべき:

型

Ret fun();

は、Ret 型のオブジェクトが逆参照され、OutputIt 型の値を代入できるような型でなければならない。 ​ Ret型要件

-
は
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 個の要素にコピー代入する
(関数テンプレート & アルゴリズム関数オブジェクト)
連続する関数呼び出しの結果を範囲内の全ての要素に代入する
(関数テンプレート & アルゴリズム関数オブジェクト)
関数の N 回の適用結果を保存する
(アルゴリズム関数オブジェクト)