mapクラス

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

mapクラスとはキーと値の組み合わせでデータを管理するためのクラスで、ちょうどハッシュテーブルの仕組みに似ているかもしれないものです。

ただし内部のデータ構造としてはツリー構造らしいので、挙動が似てるだけで実装はハッシュテーブルとは違うようです。

とりあえず実装してみます。

#include <iostream>
#include <map>
#include <string>
using namespace std;

int main () {
    // キーと値の型を指定
    map<string, int> data;
    
    data.insert( map<string, int>::value_type("ddd",40) );
    data.insert( map<string, int>::value_type("aaa",10) );
    data.insert( map<string, int>::value_type("ccc",30) );
    data.insert( map<string, int>::value_type("bbb",20) );
    data.insert( map<string, int>::value_type("eee",50) );
    
    map<string, int>::iterator it = data.begin();
    
    while( it != data.end() ) {
        cout << "key=" << it->first << " value=" << it->second << endl;
        ++it;
    }
    
    return 0;
}
$ main
key=aaa value=10
key=bbb value=20
key=ccc value=30
key=ddd value=40
key=eee value=50

できました。

宣言時にキーの型と、値の型を指定します。

要素の追加にはinsert関数を使います。

イテレータの表示では今までと違うので注意が必要です。

firstとsecondというメンバ変数へアクセスしていますが、これはキーと値が別々に格納されているのでこうなっています。

さて出力結果を見るとソートされていますね。setクラスと同様に自動的にソートされるようになっています。

しかしここまでテンプレート引数が多くなってくるといちいち何度も同じことを書くのが面倒になってきましたね。

こういう場合はtypedefを使えば良いんでしょうか?やってみました。

#include <iostream>
#include <map>
#include <string>
using namespace std;

int main () {
    typedef map<string, int> map_type;
    
    map_type data;
    
    data.insert( map_type::value_type("ddd",40) );
    data.insert( map_type::value_type("aaa",10) );
    data.insert( map_type::value_type("ccc",30) );
    data.insert( map_type::value_type("bbb",20) );
    data.insert( map_type::value_type("eee",50) );
    
    map_type::iterator it = data.begin();
    
    while( it != data.end() ) {
        cout << "key=" << it->first << " value=" << it->second << endl;
        ++it;
    }
    
    return 0;
}

とてもスッキリしましたね。こういう使い方アリなのかちょっと分かりませんが動くということはたぶんアリなんでしょう。