map四種類の使い分け

今回はmapの4種類について。

map、unordered_map、multimap、unordered_multimapといった四つの種類がある。
mapとmultimapは木構造を用いているため自動でsortされる特徴がある。
unorder_mapとunordered_multimapは自動でハッシュを用いて値の検索用に作られている。(sortされない)

mapとunorder_mapは重複を許さず、(unique)
multimapとunordered_multimapは重複して値を持てる。(multi)

それぞれの機能は以下の通り。見るだけでは中々覚えづらかったのでコピーしてお試しあれ。

#include <iostream>
#include <string>
#include <algorithm>
#include <map>
#include <unordered_map>
#include <utility>

using namespace std;

int main() {
    map<string, int>mp;//挿入するたびsort,unique,eraseが行われる
    mp["BB"] = 10;
    mp["AA"] = 20;
    mp["AA"] = 30;
    for (auto itr = mp.begin(); itr != mp.end(); itr++) {
        cout << itr->first << ' ' << itr->second << endl;
    }
    cout << endl;

    unordered_map<string, int>ump;//挿入するたびunique,eraseが行われる
    ump["BB"] = 10;
    ump["AA"] = 20;
    ump["AA"] = 30;
    for (auto itr = ump.begin(); itr != ump.end(); itr++) {
        cout << itr->first << ' ' << itr->second << endl;
    }
    cout << endl;

    multimap<string, int>mmp;//挿入するたびsortが行われる
    mmp.insert(make_pair("BB", 10));
    mmp.insert(make_pair("AA", 20));
    mmp.insert(make_pair("AA", 30));
    for (auto itr = mmp.begin(); itr != mmp.end(); itr++) {
        cout << itr->first << ' ' << itr->second << endl;
    }
    cout << endl;

    unordered_multimap<string, int>ummp;//ハッシュバージョンのpair
    ummp.insert(make_pair("BB", 10));
    ummp.insert(make_pair("AA", 20));
    ummp.insert(make_pair("AA", 30));
    for (auto itr = ummp.begin(); itr != ummp.end(); itr++) {
        cout << itr->first << ' ' << itr->second << endl;
    }
    cout << endl;

    pair<string, int>pa[10];//pairが気になる方もいると思うので載せました。
    pa[0] = make_pair("BB", 10);
    pa[1] = make_pair("AA", 20);
    pa[2] = make_pair("AA", 30);
    for (int i = 0; i < 3; i++) {
        cout << pa[i].first << ' ' << pa[i].second << endl;
    }
}

ただ、競プロだとハッシュの危険性から普段は遠慮せずにmapを使い、O(1)を必要とする場合はunordered_mapを使うのが良さそう。
でもどれも色々な場面で使えそうなSTLで良い感じ。

mapを使えるC問題はこちら。
C - Good Sequence