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
の要件を満たします。
std::unordered_map
のすべてのメンバ関数は
constexpr
です:定数式の評価中に
std::unordered_map
オブジェクトを作成および使用することが可能です。
ただし、
|
(C++26以降) |
目次 |
イテレータの無効化
| 操作 | 無効化 |
|---|---|
| すべての読み取り専用操作、 swap 、 std::swap | 無効化されない |
| clear 、 rehash 、 reserve 、 operator= | 常に無効化 |
| insert 、 emplace 、 emplace_hint 、 operator[] | リハッシュが発生した場合のみ |
| erase | 削除された要素のみ |
注記
- 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
|
LegacyForwardIterator
かつ
ConstexprIterator
(C++26以降)
で
value_type
を指す
|
const_iterator
|
LegacyForwardIterator かつ ConstexprIterator (C++26以降) で const value_type を指す |
local_iterator
|
カテゴリ、値型、差分行、ポインタ型、参照型が
iterator
と同じ
イテレータ型。このイテレータは単一のバケット内を反復処理できるが、 バケット間を移動することはできない |
const_local_iterator
|
カテゴリ、値型、差分行、ポインタ型、参照型が
const_iterator
と同じ
イテレータ型。このイテレータは単一のバケット内を反復処理できるが、 バケット間を移動することはできない |
node_type
(C++17以降)
|
コンテナノードを表す node handle の特殊化 |
insert_return_type
(C++17以降)
|
node_type
の挿入結果を記述する型。
template
<
class
Iter,
class
NodeType
>
|
メンバー関数
unordered_map
を構築する
(公開メンバ関数) |
|
unordered_map
を破棄する
(public member function) |
|
|
コンテナに値を代入する
(公開メンバ関数) |
|
|
関連付けられたアロケータを返す
(公開メンバ関数) |
|
イテレータ |
|
|
先頭を指すイテレータを返す
(公開メンバ関数) |
|
|
終端イテレータを返す
(公開メンバ関数) |
|
容量 |
|
|
コンテナが空かどうかをチェックします
(公開メンバ関数) |
|
|
要素数を返す
(公開メンバ関数) |
|
|
格納可能な最大要素数を返す
(public member function) |
|
修飾子 |
|
|
内容をクリアする
(公開メンバ関数) |
|
|
要素を挿入する
またはノード
(C++17以降)
(公開メンバ関数) |
|
|
(C++23)
|
要素の範囲を挿入する
(公開メンバ関数) |
|
(C++17)
|
要素を挿入するか、キーが既に存在する場合は現在の要素に代入する
(公開メンバー関数) |
|
要素をその場で構築する
(公開メンバ関数) |
|
|
ヒントを使用して要素をその場で構築する
(public member function) |
|
|
(C++17)
|
キーが存在しない場合はその場で挿入し、キーが存在する場合は何もしない
(公開メンバ関数) |
|
要素を削除する
(公開メンバ関数) |
|
|
内容を交換する
(公開メンバ関数) |
|
|
(C++17)
|
コンテナからノードを抽出する
(公開メンバ関数) |
|
(C++17)
|
別のコンテナからノードをスプライスする
(公開メンバ関数) |
ルックアップ |
|
|
境界チェック付きで指定された要素にアクセス
(公開メンバ関数) |
|
|
指定された要素にアクセスまたは挿入する
(公開メンバ関数) |
|
|
指定されたキーに一致する要素の数を返す
(public member function) |
|
|
特定のキーを持つ要素を検索
(public member function) |
|
|
(C++20)
|
指定されたキーを持つ要素がコンテナに含まれているかどうかをチェックします
(公開メンバ関数) |
|
指定されたキーに一致する要素の範囲を返す
(public member function) |
|
Bucket インターフェース |
|
|
指定されたバケットの先頭を指すイテレータを返す
(公開メンバ関数) |
|
|
指定されたバケットの終端を指すイテレータを返す
(public member function) |
|
|
バケット数を返す
(公開メンバ関数) |
|
|
バケットの最大数を返す
(公開メンバ関数) |
|
|
特定のバケット内の要素数を返す
(public member function) |
|
|
指定されたキーのバケットを返す
(公開メンバ関数) |
|
ハッシュポリシー |
|
|
バケットあたりの平均要素数を返す
(公開メンバ関数) |
|
|
バケットあたりの最大平均要素数を管理します
(公開メンバー関数) |
|
|
指定された数のバケットを最低限確保し、ハッシュテーブルを再生成します
(公開メンバ関数) |
|
|
指定された要素数以上の領域を確保し、ハッシュテーブルを再生成する
(公開メンバ関数) |
|
オブザーバー |
|
|
キーをハッシュするために使用される関数を返します
(public member function) |
|
|
キーの等価性を比較するために使用される関数を返します
(公開メンバ関数) |
|
非メンバー関数
|
(C++11)
(C++11)
(removed in C++20)
|
unordered_map内の値を比較する
(関数テンプレート) |
|
(C++11)
|
std::swap
アルゴリズムを特殊化する
(関数テンプレート) |
|
(C++20)
|
特定の条件を満たす全ての要素を削除する
(関数テンプレート) |
推論ガイド |
(C++17以降) |
注記
| 機能テスト マクロ | 値 | 標準 | 機能 |
|---|---|---|---|
__cpp_lib_containers_ranges
|
202202L
|
(C++23) | コンテナのためのレンジ構築と挿入 |
__cpp_lib_constexpr_unordered_map
|
202502L
|
(C++26) |
constexpr
std::unordered_map
|
例
#include <iostream> #include <string> #include <unordered_map> int main() { // 文字列から文字列へのunordered_mapを3要素で作成 std::unordered_map<std::string, std::string> u = { {"RED", "#FF0000"}, {"GREEN", "#00FF00"}, {"BLUE", "#0000FF"} }; // キーと値のペアを出力するヘルパーラムダ関数 auto print_key_value = [](const auto& key, const auto& value) { std::cout << "Key:[" << key << "] Value:[" << value << "]\n"; }; std::cout << "unordered_mapのキーと値のペアを反復処理して出力(型を明示的に指定):\n" "\n"; for (const std::pair<const std::string, std::string>& n : u) print_key_value(n.first, n.second); std::cout << "\nC++17の構造化バインディングを使用してキーと値のペアを反復処理して出力:\n"; for (const auto& [key, value] : u) print_key_value(key, value); // unordered_mapに2つの新しいエントリを追加 u["BLACK"] = "#000000"; u["WHITE"] = "#FFFFFF"; std::cout << "\nキーによる値の出力:\n" "色REDのHEX値は:[" << u["RED"] << "]\n" "色BLACKのHEX値は:[" << u["BLACK"] << "]\n\n"; std::cout << "存在しないキーでoperator[]を使用して新しいキーと値のペアを挿入:\n"; print_key_value("new_key", u["new_key"]); std::cout << "\n`auto`を使用してキーと値のペアを反復処理して出力:\n" "new_keyがマップ内のキーの1つになりました:\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つのコンテナを適合させて、一意のキーでソートされたキーと値のペアのコレクションを提供
(クラステンプレート) |