本文へスキップ
BecomeCoder

C++コース · 第14章 STLコンテナ ― 標準の入れ物を使いこなす · レッスン57

std::map ― キーと値の対応表

ブラウザで完結

導入

「名前 → 得点」「単語 → 出現回数」のように、あるキーから値を引きたい場面はとても多いです。それを担うのが std::map(連想配列・辞書)です。実務で vector と並んで最頻出のコンテナです。

説明

map<キーの型, 値の型> で宣言し、m[キー] = 値 で登録・更新、m[キー] で取得します。存在しないキーを [] で読むと、既定値(int なら 0)で新規作成される点に注意します。

flowchart LR
  subgraph M["map&lt;string, int&gt;"]
    a["りんご → 3"]
    b["みかん → 5"]
    c["ぶどう → 2"]
  end
#include <iostream>
#include <string>
#include <map>
using namespace std;

int main() {
    map<string, int> stock;
    stock["りんご"] = 3;
    stock["みかん"] = 5;
    stock["りんご"] += 2;    // 既存キーを更新 → 5

    cout << stock["りんご"] << endl;   // 5

    // キーの存在確認は count か find
    if (stock.count("ぶどう") == 0) {
        cout << "ぶどうは未登録" << endl;
    }

    // 範囲for で全要素を回す(要素は pair)
    for (const auto& kv : stock) {
        cout << kv.first << ": " << kv.second << endl;
    }
    return 0;
}

map はキーが自動でソートされて並びます(内部は二分探索木)。単語の出現回数を数えるような処理が短く書けます。

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

int main() {
    string words[] = {"a", "b", "a", "c", "a", "b"};
    map<string, int> freq;
    for (const string& w : words) {
        freq[w]++;    // 未登録なら 0 から始まり +1
    }
    for (const auto& [word, cnt] : freq) {   // 構造化束縛(第17章)
        cout << word << " x " << cnt << endl;
    }
    // a x 3 / b x 2 / c x 1(キー順)
    return 0;
}

まとめ

map<K, V> はキーから値を引く辞書で、m[key] で登録・取得します。存在確認は countfind[] は勝手に作ってしまう)。キーは自動でソートされ、出現回数の集計などに強力です。

実際に動かしてみよう

下のエディタにC++を書いて「コンパイル & 実行」を押すと、ブラウザ内で本物のC++コンパイラ(clang + libc++)がその場でコンパイルして実行し、出力が表示されます。std::string・vector・クラス・テンプレート・STL などモダンC++がそのまま動きます。本文の例を書き換えて試しながら進めましょう(初回だけコンパイラの読み込みに時間がかかります。以降はキャッシュされます。この回は標準入力(cin)は使わず、値はコードに直接書きます)。

C/C++ — ブラウザ内で本物のコンパイラで実行

ブラウザ内で本物のC/C++コンパイラ(clang + libc++ / WebAssembly)を動かします。構造体・malloc/free・std::string・vector・クラス・テンプレート・STL などがそのまま実行できます(初回のみコンパイラの読み込みに時間がかかります。以降はブラウザにキャッシュされます)。
スクロールして表示された時点でも自動で読み込まれます。