setクラス

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

setクラスとは、自動的に要素のソートを行ってくれるコンテナです。

さっそく実装してみます。

#include <iostream>
#include <set>
using namespace std;

int main () {
    
    set<int> data;
    
    data.insert(5);
    data.insert(3);
    data.insert(4);
    data.insert(2);
    data.insert(1);
    
    set<int>::iterator it = data.begin();
    
    while( it != data.end() ) {
        cout << *it << endl;
        ++it;
    }
    
    return 0;
}
$ main
1
2
3
4
5

ソートされていますね。

今までのコンテナと違って要素の追加にはinsert関数を使います。この辺の違いがややこしいので覚えておきましょう。

デフォルトでは昇順にソートされます。

降順にしたければ宣言時に

set<int, greater<int>> data;

とすれば可能です。

要素の削除はerase関数で可能ですが、これも今までのコンテナと違って使い方が少し変わります。

setクラスのeraseは戻り値を返さないので

data.erase( it++ );

といったようにイテレータが指す場所を削除して一つ進むという感じにしなければなりません。

もちろん一時変数を用意しても問題ありません。

set<int>::iterator del_it = it;
++it;
data.erase(del_it);

次に要素へのアクセスですが、setクラスはツリー構造なので[]演算子による直接アクセスはできないのでイテレータ経由でアクセスします。

また、値の検索はfind関数を使えばできます。

#include <iostream>
#include <set>
using namespace std;

int main () {
    
    set<int> data;
    
    data.insert(5);
    data.insert(3);
    data.insert(4);
    data.insert(2);
    data.insert(1);
    
    set<int>::iterator it = data.find( 3 );
    
    if ( it == data.end() ) {
        cout << "見つかりません" << endl;
    }
    else {
        cout << *it << "が見つかりました" << endl;
    }
    
    return 0;
}
$ main
3が見つかりました

find関数の戻り値はイテレータとなります。

もし値が見つからなかった場合はend関数の値が返されるのでそれと比較すれば値が存在していたかどうかを判定できます。

setクラスの利点はこういった値の探索が効率的に行えるところにあるようです。ツリー構造が故でしょうね。