第3章 アル・コワリズミ2

 今回も前回に続き、アルゴリズムについて話していきます。難しいことは置いておいて、とにかく感覚をつかんでいきましょう。


 では、今回の要点です。


 では、いってみましょう。


 いきなりですが、前回使った min_element 以外のアルゴリズムを使ってみましょう。それらのアルゴリズムは min_element と同じく algorithm ヘッダにいろいろ用意されています。

 では、簡単なところで fill を使ってみましょう。fill はデータをあるデータで埋めるという関数テンプレートです。

プログラム1
// Algo3.cpp
#include <iostream>
#include <algorithm>

using namespace std;

#define numof(array)  (sizeof (array) / sizeof *(array))

int main()
{
    int data[10];

    fill(data, data + numof(data), 0);

    for(int i = 0; i < numof(data); i++)
        cout << data[i] << ' ';
    cout << endl;

    return 0;
}
実行結果
0 0 0 0 0 0 0 0 0 0

 はい。data は全て0で埋められていますね。

 前回の min_element と今回の fill を見て分かるように、アルゴリズムの引数は一般的に

<先頭位置>, <終端の次の要素の位置>, ...

という形になっていることが分かります。

 終端の次の要素の位置は、配列では先頭位置+要素数になっています。終端位置そのものを渡すと、先頭位置+要素数−1になって少し不便ですね。わざわざ次の要素の位置を渡すようになっているのも納得がいくかと思います。前回やったように、for ループも簡単に書けます。


 また、アルゴリズムの中にはサイズを渡すものもいくつかあります。fill と同じ動作をする fill_n などがそうです。_n がついたアルゴリズムの引数は

<先頭位置>, <要素数>, ...

という風になります。

プログラム2
// Algo4.cpp
#include <iostream>
#include <algorithm>

using namespace std;

#define numof(array)  (sizeof (array) / sizeof *(array))

int main()
{
    int data[10];

    fill_n(data, numof(data), 0);

    for(int i = 0; i < numof(data); i++)
        cout << data[i] << ' ';
    cout << endl;

    return 0;
}
実行結果
0 0 0 0 0 0 0 0 0 0

 はい。問題ありませんね。


 上のプログラムを見ると、結果を表示する部分もループ処理になっています。ということは、この部分もアルゴリズムで処理できそうです。

 for_each というアルゴリズムはそれぞれの要素に対して第3引数に渡された関数を実行するというアルゴリズムです。データを表示する関数を作って、それを for_each に渡せば良さそうですね。

プログラム3
// Algo5.cpp
#include <iostream>
#include <algorithm>

using namespace std;

#define numof(array)  (sizeof (array) / sizeof *(array))

void Disp(int num)
{
    cout << num << ' ';
}

int main()
{
    int data[10];

    fill_n(data, numof(data), 0);

    for_each(data, data + numof(data), Disp);
    cout << endl;

    return 0;
}
実行結果
0 0 0 0 0 0 0 0 0 0

 for_each を実行すると、順次 Disp(data[0]), Disp(data[1]), Disp(data[2]), ... と実行されるわけです。そして、Disp(data[9]) まで実行され、0 が10個表示されたわけです。

 このように、アルゴリズムはループ処理を行う時に役に立ってくれるわけです。アルゴリズムを使えば、fill という名前から「これはデータをあるデータで埋めるという処理だ」ということが一目で分かり、読みやすさも増しますね。


 では、今回の要点です。


 次回はイテレータというものについて話してみたいと思います。「先頭アドレス」でなく「先頭位置」と、「配列」でなく「配列のようなもの」と言ってきた理由などが分かると思います。それでは。


第2章 アル・コワリズミ | 第4章 偽ポインタ

Last update was done on 2001.7.8

この講座の著作権はロベールが保有しています