C++ STLでmap・unordered_mapを走査する方法を徹底解説
C++のSTLには、キーと値のペアを格納できる連想コンテナが用意されています。本記事では、その代表格であるmapとunordered_mapの基本的な使い方と、要素を走査(トラバース)する方法を解説します。
mapコンテナとは
mapは、各要素を「キー」と「値」のペアとして管理する連想コンテナです。内部的にはハッシュマップ的な仕組みで要素が整理されており、同じキーを持つ要素は2つ以上存在できません。この特性を活かすことで、出現回数の集計などが簡潔に実装できます。
mapの主なメンバ関数
- begin():mapの先頭要素を指すイテレータを返します。
- end():最後の要素の次(理論上の末尾)を指すイテレータを返します。
- size():mapに格納されている要素数を返します。
- max_size():mapが保持できる最大要素数を返します。
- empty():mapが空かどうかを判定します。
mapを使った実装例
次のサンプルコードでは、配列内の各数値の出現頻度をmapで集計し、範囲ベースforループで走査して表示しています。
#include <bits/stdc++.h>
using namespace std;
int main() {
int A[] = { 2, 2, 3, 2, 2, 4, 5, 4 };
int num = sizeof(A) / sizeof(A[0]);
map<int, int> my_map;
for (int p = 0; p < num; p++)
my_map[A[p]]++;
cout << "Item Frequency" << endl;
for (auto p : my_map)
cout << p.first << " : " << p.second << endl;
}
実行結果
Item Frequency
2 : 4
3 : 1
4 : 2
5 : 1
mapは内部でキー順にソートして管理するため、出力結果もキーの昇順(2、3、4、5)に並んでいる点に注目してください。
unordered_mapとは
unordered_mapは、C++ STLに用意されているもう一つの連想コンテナです。mapと同様にキーと値のペアを格納しますが、キーは値を一意に識別するために使われ、キーと値はそれぞれ組み込み型でもユーザー定義型でも構いません。
mapとの大きな違いは、unordered_mapがハッシュテーブルを基盤としており、要素の順序が保証されないという点です。その代わり、平均的に高速な検索・挿入・削除(O(1))を実現できます。
unordered_mapを使った実装例
#include <bits/stdc++.h>
using namespace std;
int main() {
int A[] = { 2, 2, 3, 2, 2, 4, 5, 4 };
int num = sizeof(A) / sizeof(A[0]);
unordered_map<int, int> my_map;
for (int p = 0; p < num; p++)
my_map[A[p]]++;
cout << "Item Frequency" << endl;
for (auto p : my_map)
cout << p.first << " : " << p.second << endl;
}
実行結果
Item Frequency
5 : 1
4 : 2
2 : 4
3 : 1
このように、unordered_mapでは出力順序がキーの昇順にならず、ハッシュ関数による内部配置の順に表示されます。順序が必要ならmap、速度を優先するならunordered_mapを選ぶのが一般的な指針です。
-
C++ STLのセット(set)とマップ(map)とは?違いと基本的な使い方を解説
セット(std::set)とは セット(Set)は抽象データ型の一種で、要素の値そのものが識別子として機能するため、すべての要素が一意である必要があります。一度セットに追加した要素の値を直接変更することはできませんが、該当する要素を削除してから、変更後の値を新たに挿入し直すことは可能です。 マップ(std::map)とは マップ(Map)は、要素を「キー」と「値」のペアとして格納する連想コンテナです。各要素はキー値(key)とマップ値(mapped value)を持ち、同一のキー値を持つ要素が複数存在することはありません。 以上の説明から、両者の違いは次のように整理できます。 セット:
-
STLのマップ(map)を実装するC++プログラムの書き方
マップ(map)とはマップは、要素をキーと値のペアとして対応付けて格納する連想コンテナです。各要素はキー値とマップ値を持ち、同じキー値を持つ要素が複数存在することはありません。使用する主なメンバ関数m::find() – マップ内に指定したキー値(b)を持つ要素が見つかれば、その要素へのイテレータを返します。見つからない場合はend()へのイテレータを返します。m::erase() – マップから指定したキー値の要素を削除します。m::equal_range() – ペア(pair)のイテレータを返します。このペアは、指定したキーと等価なキーを持つコンテナ内のすべての要素を含む範囲の境界を表し