導入
「名前 → 得点」「単語 → 出現回数」のように、あるキーから値を引きたい場面はとても多いです。それを担うのが std::map(連想配列・辞書)です。実務で vector と並んで最頻出のコンテナです。
説明
map<キーの型, 値の型> で宣言し、m[キー] = 値 で登録・更新、m[キー] で取得します。存在しないキーを [] で読むと、既定値(int なら 0)で新規作成される点に注意します。
flowchart LR
subgraph M["map<string, int>"]
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] で登録・取得します。存在確認は count や find([] は勝手に作ってしまう)。キーは自動でソートされ、出現回数の集計などに強力です。