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