第96章 generateアルゴリズム関数を使う


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を加えることを忘れないでください。




[C++Index] [総合Index] [Previous Chapter] [Next Chapter]

Update Aug/10/2005 By Y.Kumei
当ホーム・ページの一部または全部を無断で複写、複製、 転載あるいはコンピュータ等のファイルに保存することを禁じます。