今回からSTLについて話していきたいと思います。先ず初めの今回は「アルゴリズム」についてです。
以下が今回の要点です。
では、いってみましょう。
今回からずずずっとSTLについて話していくわけですが、STLがどういうものなのかを話す前にちょっとSTLを使ってみましょう。
| プログラム1 | 
|---|
| // Algo1.cpp
#include <iostream>
#include <algorithm>
using namespace std;
#define numof(array)  (sizeof (array) / sizeof *(array))
int main()
{
    int data[] = { 4, 2, 9, 7, 1, };
    cout << *min_element(data, data + numof(data)) << endl;
    return 0;
} | 
| 実行結果 | 
| 1 | 
この min_element というのはSTLの関数テンプレートの1つで、配列の中で一番小さい要素のアドレスを返す関数テンプレートです。引数には先頭位置と先頭位置+要素数 を渡しています。何ということもない処理ですね。ヘッダファイルは algorithm です。
この処理がなぜ関数でなく関数テンプレートとして作られているかというのは、どんな型の配列にでも使えるようにするためです。
このくらいならちょっと作ってみることもできそうですね。では、作ってみましょう。
| プログラム2 | 
|---|
| // Algo2.cpp
#include <iostream>
using namespace std;
#define numof(array)  (sizeof (array) / sizeof *(array))
template <typename TYPE>
TYPE min_element(TYPE pBegin, TYPE pEnd)
{
    TYPE pMin;
    for(TYPE p = pMin = pBegin; p != pEnd; ++p)
        if(*p < *pMin)
            pMin = p;
    return pMin;
}
int main()
{
    int data[] = { 4, 2, 9, 7, 1, };
    cout << *min_element(data, data + numof(data)) << endl;
    return 0;
} | 
| 実行結果 | 
| 1 | 
はい。同じ動作をしますね。
STLというのは、こんな風にテンプレートを駆使しまくったライブラリなわけです。型を気にせず使えるという点が非常に魅力的なわけです。
STLは「アルゴリズム」「関数オブジェクト」「コンテナ・イテレータ」「スマートポインタ」など、いろいろなものから成り立っています。それぞれがどういうものかは今は話しませんが、今回使った「アルゴリズム」に関してはちょっと話したいと思います。
今回使った min_element という関数テンプレートは「アルゴリズム」と呼ばれるものの1つです。アルゴリズムというと、普通は「ある目的を果たすための処理の方法」といった意味ですが、STLの言う「アルゴリズム」はちょっと違います。STLの言うアルゴリズムとは「配列のようなものに対するループ処理を行う関数テンプレート」のことなのです。
大仰な名前が付いていますが、中身は上のようにたいしたものではありません(ものにもよりますが)。とにかく、for ループでぐるぐるーっとやったのがアルゴリズムなわけです。
いろいろまだいいたいこともありますが、長くなるので次回に回したいと思います。
では、今回の要点です。
タイトルの「アル・コワリズミ」というのは、アルゴリズムの語源となった9世紀のアラビアの数学者の名前です。雑学知識としてどうぞ。
それでは、次回まで。
Last update was done on 2001.7.8
この講座の著作権はロベールが保有しています