std::map: 連想配列
キーと値のペアを格納。順序が必要なら map、速度なら unordered_map。
std::map
順序付き連想配列(赤黒木)。
unordered_map
ハッシュテーブル。O(1)アクセス。
std::pair
key-value のペア。
map とは?
C++の `std::map` は通常、赤黒木(Red-Black Tree)で実装されており、キーは常にソートされた状態で保持されます。挿入や検索の計算量は O(log N) です。順序が不要なら、より高速な `std::unordered_map` (Hash Table) が推奨されます。
#include <map>#include <string>
std::map<std::string, int> ages;
// 挿入ages["Alice"] = 30;ages.insert({"Bob", 25});ages.emplace("Charlie", 35);
// アクセスint age = ages["Alice"]; // 存在しなければ挿入int safe = ages.at("Bob"); // 存在しなければ例外
// 検索if (auto it = ages.find("Dave"); it != ages.end()) { std::cout << it->second << "";}実行結果
ages["Alice"] = 30
ages.at("Bob") = 25
ages.find("Dave") == ages.end() Bad
// ❌ Bad: [] で存在確認if (ages["Unknown"] == 0) { // 挿入されてしまう! // ...}Good
// ✅ Good: find で存在確認if (ages.find("Unknown") == ages.end()) { // 存在しない}// C++20: containsif (!ages.contains("Unknown")) { }map vs unordered_map
// std::map: 順序付き(赤黒木)std::map<int, std::string> ordered; // キーでソート
// std::unordered_map: ハッシュテーブル(高速)std::unordered_map<int, std::string> fast; // O(1)
// イテレーションfor (const auto& [key, value] : ages) { // C++17 構造化束縛 std::cout << key << ": " << value << "";}
// 削除ages.erase("Bob");ages.clear(); Tip: 順序が不要なら unordered_map(O(1))を選ぶ。
合格ライン
find で存在確認できる
map と unordered_map の違いを説明できる
参考リンク
演習課題
課題1: 単語カウント
文章中の各単語の出現回数をカウントするプログラムを作成してください。
課題2: find vs [ ]
存在しないキーに対する find と [] の違いを実験してください。