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