Namespaces
Variants

std::generate

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

ソート操作
二分探索操作
(分割されたレンジ上で)
集合操作 (ソート済みレンジ上で)
マージ操作 (ソート済みレンジ上で)
ヒープ操作
最小/最大操作
(C++11)
(C++17)
辞書順比較操作
順列操作


 
ヘッダで定義 <algorithm>
template< class ForwardIt, class Generator >
void generate( ForwardIt first, ForwardIt last, Generator g );
(1) (C++20からconstexpr)
template< class ExecutionPolicy, class ForwardIt, class Generator >
void generate( ExecutionPolicy&& policy,
               ForwardIt first, ForwardIt last, Generator g );
(2) (C++17から)
1) 範囲 [first, last) 内の各要素に、与えられた関数オブジェクト g によって生成された値を代入します。
2) (1) と同じですが、policy に従って実行されます。
このオーバーロードは、次の式の値が true である場合にのみオーバーロード解決に参加します。

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

(C++20まで)

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

(C++20から)

引数

first, last - 生成する要素の範囲を定義するイテレータのペア
policy - 使用する実行ポリシー
g - 呼び出される生成関数オブジェクト。

関数のシグネチャは以下と等価である必要があります。

Ret fun();

型 Ret は、型 ForwardIt のオブジェクトが逆参照され、型 Ret の値が代入可能であるようにする必要があります。 ​

型要件
-
ForwardIt は LegacyForwardIterator の要件を満たす必要があります。

計算量

厳密に std::distance(first, last) 回の g() の呼び出しと代入。

例外

テンプレートパラメータ名 ExecutionPolicy を持つオーバーロードは、次のようにエラーを報告します。

  • アルゴリズムの一部として呼び出された関数の実行が例外を投げ、かつ ExecutionPolicy が 標準ポリシー のいずれかである場合、std::terminate が呼び出されます。それ以外の ExecutionPolicy については、動作は処理系定義です。
  • アルゴリズムがメモリの確保に失敗した場合、std::bad_alloc が投げられます。

実装例

template<class ForwardIt, class Generator>
constexpr //< since C++20
void generate(ForwardIt first, ForwardIt last, Generator g)
{
    for (; first != last; ++first)
        *first = g();
}

例

#include <algorithm>
#include <iostream>
#include <vector>

void println(std::string_view fmt, const auto& v)
{
    for (std::cout << fmt; const auto& e : v)
        std::cout << e << ' ';
    std::cout << '\n';
};


int f()
{
    static int i;
    return ++i;
}

int main()
{
    std::vector<int> v(5);
    
    std::generate(v.begin(), v.end(), f);
    println("v: ", v);
    
    // Initialize with default values 0,1,2,3,4 from a lambda function
    // Equivalent to std::iota(v.begin(), v.end(), 0);
    std::generate(v.begin(), v.end(), [n = 0] () mutable { return n++; });
    println("v: ", v);
}

出力:

v: 1 2 3 4 5
v: 0 1 2 3 4

関連項目

範囲内の全ての要素に指定された値をコピー代入する
(関数テンプレート & アルゴリズム関数オブジェクト)
範囲内のN個の要素に連続的な関数呼び出しの結果を代入する
(関数テンプレート & アルゴリズム関数オブジェクト)
(C++11)
範囲を開始値の連続的な増分で埋める
(関数テンプレート & アルゴリズム関数オブジェクト)
関数の結果を範囲に保存する
(アルゴリズム関数オブジェクト)