簡単なSTLアルゴリズム

http://www.geocities.jp/ky_webid/cpp/library/016.html

STLには様々なアルゴリズムが存在します。STLアルゴリズムは、STLに用意されている各種コンテナの各要素を対象とするように作られた、グローバルなテンプレート関数です。コンテナの種類ごとにメンバ関数として用意されている訳ではありません。

ということでいくつかの関数の紹介がありました。一つずつ見ていきましょう。


count()


count関数は、指定された値が何個あるかを数えます。使ってみましょう。

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int main () {
    vector<int> data;
    
    data.push_back(10);
    data.push_back(10);
    data.push_back(20);
    data.push_back(30);
    
    // 10という値が何個あるか?
    int cnt = static_cast<int>( count(data.begin(),data.end(),10) );
    
    cout << cnt << endl;
    
    return 0;
}
$ main
2

簡単ですね。ちなみにcount関数の戻り値は本来difference_typeという型らしいのですが、今回の例ではstatic_castを用いてintに変換してから扱っています。


find()


指定された値を検索し、そのイテレータを返します。

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int main () {
    vector<int> data;
    
    data.push_back(10);
    data.push_back(20);
    data.push_back(30);
    
    vector<int>::iterator it = find(data.begin(),data.end(),20);
    
    if ( it == data.end() ) {
        cout << "見つかりませんでした" << endl;
    }
    else {
        cout << *it << "が見つかりました" << endl;
    }
    
    return 0;
}
$ main
20が見つかりました

なお、setクラスやmapクラスのように、既にそのメンバ関数にfindが提供されているようなクラスではメンバ関数の方を使った方が効率が良いらしいです。

なのでvectorやlistの時に使うのが良いんですかね。


fill()


指定された値で要素を埋めます。

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int main () {
    vector<int> data;
    
    data.push_back(10);
    data.push_back(20);
    data.push_back(30);
    
    // 全部999に変更する
    fill(data.begin(),data.end(),999);
    
    vector<int>::iterator it  = data.begin();
    vector<int>::iterator end = data.end();
    for(;it!=end;++it) {
        cout << *it << endl;
    }
    
    return 0;
}
$ main
999
999
999

変更されてますね。


max_element()


一番最大の要素の位置を取得します。

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int main () {
    vector<int> data;
    
    data.push_back(10);
    data.push_back(200);
    data.push_back(30);
    
    vector<int>::iterator max = max_element(data.begin(),data.end());
    
    cout << *max << endl;
    
    return 0;
}
$ main
200

ちなみに最小のサイズを得る場合はmin_element関数というので可能です。使い方は同じなので割愛。