Share via


generate_n

 

範囲内の指定された数の要素に関数オブジェクトによって生成される値を割り当て、最後に割り当てられた値を 1 つ超えた位置を返します。

構文

template<class OutputIterator, class Diff, class Generator> void generate_n( OutputIterator First, Diff Count, Generator Gen);

パラメーター

  • First
    値が割り当てられる範囲の最初の要素の位置を示す出力反復子。

  • Count
    ジェネレーター関数によって値が割り当てられる要素の数を指定する符号付きまたは符号なし整数の型。

  • Gen
    引数を指定しないで呼び出され、範囲内の各要素に割り当てられる値を生成するために使用される関数オブジェクト。

解説

関数オブジェクトは範囲内の要素ごとに呼び出されます。呼び出されるたびに同じ値を返す必要はありません。  たとえば、ファイルから読み取る、ローカル状態を参照して変更するなどのことができます。  ジェネレーターの結果の型は、その範囲の前方反復子の値の型に変換可能である必要があります。  

参照される範囲が有効であり、すべてのポインターが逆参照可能であって、かつシーケンス内で先頭位置からのインクリメントにより最後の位置に到達可能である必要があります。

複雑さは、要求されているジェネレーターへの呼び出し回数 Count に正確に比例して線形的です。

使用例

// cl.exe /EHsc /nologo /W4 /MTd
#include <vector>
#include <deque>
#include <iostream>
#include <string>
#include <algorithm>
#include <random>

using namespace std;

template <typename C> void print(const string& s, const C& c) {
    cout << s;

    for (const auto& e : c) {
        cout << e << " ";
    }

    cout << endl;
}

int main()
{
    const int elemcount = 5;
    vector<int> v(elemcount);
    deque<int> dq(elemcount);

    // Set up random number distribution
    random_device rd;
    mt19937 engine(rd());
    uniform_int_distribution<int> dist(-9, 9);

    // Call generate_n, using a lambda for the third parameter
    generate_n(v.begin(), elemcount, [&](){ return dist(engine); });
    print("vector v is: ", v);

    generate_n(dq.begin(), elemcount, [&](){ return dist(engine); });
    print("deque dq is: ", dq);
}

出力

vector v is: 1 -9 -3 2 -9
deque dq is: -9 7 -2 4 8

必要条件

ヘッダー: <algorithm>

名前空間: std

参照

generate_n (STL のサンプル)
標準テンプレート ライブラリ