C++ std::map完全ガイド:連想配列の実践的活用とコード例
std::mapとは
C++標準テンプレートライブラリ(STL)において、std::mapはキー・値ペアとして要素を格納する連想コンテナです。各キーは一意であり、コンテナはキーの比較関数(デフォルトはstd::less)に従って要素を自動的にソート順で保持します。値は任意の型で、対応するキーを通じてアクセスされます。
なぜstd::mapを使うのか
- キーが一意かつソート順で格納されるため、検索操作が高速(
O(log n)) - 順序保証付きの連想配列やディクショナリが必要なシナリオに最適
- 内部的に平衡二分探索木(赤黒木)で実装され、すべての操作で信頼性の高いパフォーマンスを提供
- 高速な挿入、削除、走査をサポート
- イテレータやSTLアルゴリズムとシームレスに統合される豊富なAPI
構文
mapを以下のように宣言:
std::map<KeyType, ValueType> mapName;
KeyType– キーの型(比較可能でなければならない)ValueType– マッピングされる値の型mapName– 変数名
例:
std::map<std::string, int> ageMap;
メンバ型
- key_type:キーの型
- mapped_type:マッピングされる値の型
- value_type:
std::pair<const key_type, mapped_type> - iterator:
value_type上の双方向イテレータ - const_iterator、reverse_iterator、const_reverse_iterator
- size_type、difference_type
組み込み関数
begin()– 最初の要素へのイテレータend()– 末尾の次のイテレータsize()– 要素数empty()– mapが空かどうかinsert()– キー/値ペアを追加find()– キーで要素を検索erase()– イテレータまたはキーで要素を削除clear()– 全要素を削除- その他
count()、lower_bound()などのユーティリティも利用可能
map要素のイテレーション
イテレータを使うと、常にキーでソートされた順序で走査できます。
#include <iostream>
#include <string>
#include <map>
using namespace std;
int main() {
map<int, string> students;
students.insert({200, "Alice"});
students.insert({201, "John"});
cout << "Map size is: " << students.size() << endl;
cout << endl << "Default map order:" << endl;
for (auto it = students.begin(); it != students.end(); ++it) {
cout << it->first << ": " << it->second << endl;
}
return 0;
}
出力:
std::mapへのデータ挿入
新規エントリにはinsert()を使用;重複キーは無視されます。既存キーを上書きするにはinsert_or_assign()を使用。
#include <map>
#include <iostream>
using namespace std;
int main() {
map<int, int> m{{1,3},{2,4},{3,5}};
m.insert({5,6}); // 新しいペアを追加
m.insert({1,8}); // 無視される(キー1は既存)
m.insert_or_assign(1,6); // キー1の値を6に更新
cout << "Key\tElement\n";
for (auto& p : m) {
cout << p.first << '\t' << p.second << '\n';
}
return 0;
}
出力:
mapでの検索
find()でキーを検索します。キーが存在すればイテレータが要素を指し、なければend()が返されます。
#include <iostream>
#include <map>
using namespace std;
int main() {
map<int, string> students;
students.insert({200, "Alice"});
students.insert({201, "John"});
if (auto it = students.find(201); it != students.end()) {
cout << "Key 201 has value: " << it->second << endl;
}
return 0;
}
出力:
mapからのデータ削除
要素はキーまたはイテレータで削除可能。erase()は削除された要素を指すイテレータのみを無効化します。
#include <iostream>
#include <map>
using namespace std;
int main() {
map<string, int> myMap;
myMap["cow"] = 1;
myMap["cat"] = 2;
myMap["lion"] = 3;
if (auto it = myMap.find("cat"); it != myMap.end()) {
myMap.erase(it);
}
for (auto& p : myMap) {
cout << p.first << ": " << p.second << endl;
}
return 0;
}
出力:
まとめ
std::mapは一意のキーを持つソート済み連想コンテナ- キーで効率的な検索;値に関連データを保持
- 赤黒木ベースで全主要操作が対数時間
- イテレータで走査、挿入、削除、範囲クエリが可能
insert_or_assign()で値更新が容易find()で高速な存在チェックと直接アクセス- 単一要素の削除から全クリアまで柔軟に対応
C言語