std::unordered_map
| ヘッダ <unordered_map> で定義 |
||
| template< class Key, |
(1) | (C++11以降) |
| namespace pmr { template< |
(2) | (C++17以降) |
std::unordered_map は、一意なキーを持つキーと値のペアを格納する連想コンテナです。要素の検索、挿入、削除の平均計算量は定数時間です。
内部的には、要素は特定の順序でソートされず、バケットに編成されます。要素がどのバケットに配置されるかは、そのキーのハッシュ値に完全に依存します。同じハッシュコードを持つキーは同じバケットに現れます。これにより、ハッシュが計算されると、要素が配置されている正確なバケットを参照するため、個々の要素への高速なアクセスが可能になります。
2つのキーは、マップのキー等価性判定述語がそれらのキーを渡されたときに true を返す場合、等価であると見なされます。2つのキーが等価である場合、ハッシュ関数は両方のキーに対して同じ値を返さなければなりません。
std::unordered_map は コンテナ (Container)、アロケータ認識コンテナ (AllocatorAwareContainer)、非順序連想コンテナ (UnorderedAssociativeContainer) の要件を満たします。
|
|
(C++26以降) |
目次 |
[編集] イテレータの無効化
| 操作 | 無効になる条件 |
|---|---|
| 全ての読み取り専用操作、swap、std::swap | 決して無効化されない |
| clear、rehash、reserve、operator= | 常に無効化される |
| insert、emplace、emplace_hint、operator[] | リハッシュを引き起こした場合のみ |
| erase | 削除された要素へのもののみ |
[編集] 備考
- swap 関数はコンテナ内のどのイテレータも無効化しませんが、swap 領域の終わりを示すイテレータは無効化します。
- コンテナに格納されているキーまたはデータのいずれかへの参照およびポインタは、対応するイテレータが無効化された場合でも、その要素が削除されることによってのみ無効化されます。
[編集] テンプレートパラメータ
| このセクションは未完成です 理由: テンプレートパラメータの説明を追加してください。 |
[編集] メンバ型
| 型 | 定義 |
key_type
|
Key |
mapped_type
|
T |
value_type
|
std::pair<const Key, T> |
size_type
|
符号なし整数型 (通常は std::size_t) |
difference_type
|
符号付き整数型 (通常は std::ptrdiff_t) |
hasher
|
Hash |
key_equal
|
KeyEqual |
allocator_type
|
Allocator |
reference
|
value_type& |
const_reference
|
const value_type& |
pointer
|
std::allocator_traits<Allocator>::pointer |
const_pointer
|
std::allocator_traits<Allocator>::const_pointer |
iterator
|
value_type への 旧前方イテレータ (LegacyForwardIterator) および 定数式イテレータ (ConstexprIterator)(C++26から) |
const_iterator
|
const value_type への LegacyForwardIteratorおよび ConstexprIterator(C++26 以降) |
local_iterator
|
カテゴリ、値、差分、ポインタ、および 参照型が iterator と同じイテレータ型。このイテレータは、単一のバケットを走査するために使用できるが、バケットをまたいで使用することはできない |
const_local_iterator
|
カテゴリ、値、差分、ポインタ、および 参照型が const_iterator と同じ。このイテレータは、単一のバケットを走査するために使用できるが、バケットをまたいで使用することはできない |
node_type (C++17以降) |
コンテナのノードを表す ノードハンドル の特殊化 |
insert_return_type (C++17 以降) |
node_type の挿入結果を記述する型。以下の特殊化であるtemplate<class Iter, class NodeType> |
[編集] メンバ関数
unordered_map を構築する(公開メンバ関数) | |
unordered_map を破棄する(公開メンバ関数) | |
| コンテナに値を代入する (公開メンバ関数) | |
| 関連付けられたアロケータを返す (公開メンバ関数) | |
イテレータ | |
| 先頭へのイテレータを返す (public メンバ関数) | |
| 末尾へのイテレータを返す (public メンバ関数) | |
容量 | |
| コンテナが空かどうかをチェックする (public メンバ関数) | |
| 要素数を返す (public メンバ関数) | |
| 可能な最大要素数を返す (public メンバ関数) | |
変更 | |
| 内容をクリアする (公開メンバ関数) | |
| 要素 またはノード(C++17以降)を挿入する (公開メンバ関数) | |
| (C++23) |
要素の範囲を挿入する (公開メンバ関数) |
| (C++17) |
要素を挿入するか、キーが既に存在する場合は現在の要素に代入する (public member function) |
| 要素を直接構築する (公開メンバ関数) | |
| ヒントを使用して要素を直接構築する (公開メンバ関数) | |
| (C++17) |
キーが存在しない場合はインプレースで挿入し、キーが存在する場合は何もしない (public member function) |
| 要素を削除する (公開メンバ関数) | |
| 内容を交換する (public メンバ関数) | |
| (C++17) |
コンテナからノードを抽出する (公開メンバ関数) |
| (C++17) |
他のコンテナからノードを連結する (公開メンバ関数) |
検索 | |
| 境界チェック付きで指定された要素にアクセスする (public メンバ関数) | |
| 指定された要素にアクセスまたは挿入する (public メンバ関数) | |
| 特定のキーに一致する要素の数を返す (公開メンバ関数) | |
| 特定のキーを持つ要素を検索する (公開メンバ関数) | |
| (C++20) |
コンテナが特定のキーを持つ要素を含むか確認する (公開メンバ関数) |
| 特定のキーに一致する要素の範囲を返す (公開メンバ関数) | |
バケットインターフェース | |
| 指定されたバケットの先頭を指すイテレータを返す (public member function) | |
| 指定されたバケットの末尾を指すイテレータを返す (public member function) | |
| バケット数を返す (public member function) | |
| バケットの最大数を返す (public member function) | |
| 特定のバケット内の要素数を返す (public member function) | |
| 特定のキーに対するバケットを返す (public member function) | |
ハッシュポリシー | |
| バケットあたりの平均要素数を返す (public member function) | |
| バケットあたりの最大平均要素数を管理する (public member function) | |
| 少なくとも指定された数のバケットを確保し、ハッシュテーブルを再生成する (public member function) | |
| 少なくとも指定された数の要素のためのスペースを確保し、ハッシュテーブルを再生成する (public member function) | |
監視 | |
| キーのハッシュに使用される関数を返す (public member function) | |
| キーの等価性比較に使用される関数を返す (public member function) | |
[編集] 非メンバ関数
| (C++11)(C++11)(C++20で削除) |
unordered_map 内の値を比較する (function template) |
| std::swap アルゴリズムを特殊化する (関数テンプレート) | |
| (C++20) |
特定の基準を満たすすべての要素を削除する (関数テンプレート) |
推論補助 |
(C++17以降) |
[編集] 備考
| 機能テストマクロ | 値 | 規格 | 機能 |
|---|---|---|---|
__cpp_lib_containers_ranges |
202202L |
(C++23) | コンテナのRangeコンストラクタとRange挿入 |
__cpp_lib_constexpr_containers |
202502L |
(C++26) | constexpr std::unordered_map |
[編集] 例
#include <iostream> #include <string> #include <unordered_map> int main() { // Create an unordered_map of three strings (that map to strings) std::unordered_map<std::string, std::string> u = { {"RED", "#FF0000"}, {"GREEN", "#00FF00"}, {"BLUE", "#0000FF"} }; // Helper lambda function to print key-value pairs auto print_key_value = [](const auto& key, const auto& value) { std::cout << "Key:[" << key << "] Value:[" << value << "]\n"; }; std::cout << "Iterate and print key-value pairs of unordered_map, being\n" "explicit with their types:\n"; for (const std::pair<const std::string, std::string>& n : u) print_key_value(n.first, n.second); std::cout << "\nIterate and print key-value pairs using C++17 structured binding:\n"; for (const auto& [key, value] : u) print_key_value(key, value); // Add two new entries to the unordered_map u["BLACK"] = "#000000"; u["WHITE"] = "#FFFFFF"; std::cout << "\nOutput values by key:\n" "The HEX of color RED is:[" << u["RED"] << "]\n" "The HEX of color BLACK is:[" << u["BLACK"] << "]\n\n"; std::cout << "Use operator[] with non-existent key to insert a new key-value pair:\n"; print_key_value("new_key", u["new_key"]); std::cout << "\nIterate and print key-value pairs, using `auto`;\n" "new_key is now one of the keys in the map:\n"; for (const auto& n : u) print_key_value(n.first, n.second); }
実行結果の例
Iterate and print key-value pairs of unordered_map, being explicit with their types: Key:[BLUE] Value:[#0000FF] Key:[GREEN] Value:[#00FF00] Key:[RED] Value:[#FF0000] Iterate and print key-value pairs using C++17 structured binding: Key:[BLUE] Value:[#0000FF] Key:[GREEN] Value:[#00FF00] Key:[RED] Value:[#FF0000] Output values by key: The HEX of color RED is:[#FF0000] The HEX of color BLACK is:[#000000] Use operator[] with non-existent key to insert a new key-value pair: Key:[new_key] Value:[] Iterate and print key-value pairs, using `auto`; new_key is now one of the keys in the map: Key:[new_key] Value:[] Key:[WHITE] Value:[#FFFFFF] Key:[BLACK] Value:[#000000] Key:[BLUE] Value:[#0000FF] Key:[GREEN] Value:[#00FF00] Key:[RED] Value:[#FF0000]
[編集] 欠陥報告
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| LWG 2050 | C++11 | reference、const_reference、pointer、および const_pointer の定義が allocator_type に基づいていた |
value_type およびstd::allocator_traits に基づくように変更 |
[編集] 関連項目
| (C++11) |
キーでハッシュ化されたキーと値のペアのコレクション (クラステンプレート) |
| キーでソートされたキーと値のペアのコレクション、キーは一意 (クラステンプレート) | |
| (C++23) |
ユニークなキーによってソートされたキーと値のペアのコレクションを提供するために2つのコンテナを適合させる (クラステンプレート) |