generate関数は、指定した関数を利用してそれぞれの要素に値を埋めます。
template<class ForwardIterator, class Generator>
   void generate(
      ForwardIterator _First, 
      ForwardIterator _Last, 
      Generator _Gen
   );
この時、値を発生する関数は引数を取らないものに限ります。では、サンプルを見てみましょう。
// generate01.cpp
#include <iostream>
#include <vector>
#include <algorithm>
#include <time.h>
int mygenerate();
using namespace std;
int main()
{
    vector <int> v(6);
    int i;
    generate(v.begin(), v.end(), mygenerate);
    for (i = 0; i < (int)v.size(); i++)
        cout << v[i] << "-";
    cout << endl;
    return 0;
}
int mygenerate()
{
    time_t mytm;
    struct tm *localtm;
    static int i = -1, j;
    mytm = time(NULL);
    localtm = localtime(&mytm);
    i++;
    j = i % 9;
    
    switch (j) {
        case 0:
            return localtm->tm_year + 1900;
        case 1:
            return localtm->tm_mon + 1;
        case 2:
            return localtm->tm_mday;
        case 3:
            return localtm->tm_hour;
        case 4:
            return localtm->tm_min;
        case 5:
            return localtm->tm_sec;
        default:
            return 0;
    }
}
これは、ちょっとひねくれたプログラムです。
generate(v.begin(), v.end(), mygenerate);これで、ベクターvの要素をmygenerate関数を6回呼び出して埋めます。
mygenerate関数はどうなっているかというと、 まず、time関数で、1900/01/01からの経過秒数を取得します。
これをlocaltime関数を使って、tm型構造体の各メンバに地方時間を格納します。
この関数が呼ばれるたびに、iの値が1増えます。
最初は0なので、localtm->tm_year + 1900つまり、現在の西暦が返されます。
次に呼ばれたときは、localtm->tm_mon + 1で現在の月が返されます。
その次は、現在の日、時、分、秒というように返します。
結果的に、ベクタの要素には、年、月、日、時、分、秒が格納されるという仕組です。
では、結果を見てみましょう。
なるほど、変なプログラムですね。
tm構造体を使うときはtm_monメンバの値に1を加えることを忘れないでください。
Update Aug/10/2005 By Y.Kumei