Namespaces
Variants

std:: unordered_map

From cppreference.net
ヘッダーで定義 <unordered_map>
template <

class Key,
class T,
class Hash = std:: hash < Key > ,
class KeyEqual = std:: equal_to < Key > ,
class Allocator = std:: allocator < std:: pair < const Key, T >>

> class unordered_map ;
(1) (C++11以降)
namespace pmr {

template <
class Key,
class T,
class Hash = std:: hash < Key > ,
class KeyEqual = std:: equal_to < Key >
> using unordered_map =
std :: unordered_map < Key, T, Hash, KeyEqual,
std:: pmr :: polymorphic_allocator < std:: pair < const Key, T >>> ;

}
(2) (C++17以降)

std::unordered_map は、一意のキーを持つキーと値のペアを含む連想コンテナです。要素の検索、挿入、削除は平均的に定数時間の計算量を持ちます。

内部的には、要素は特定の順序でソートされず、バケットに整理されます。要素がどのバケットに配置されるかは、そのキーのハッシュに完全に依存します。同じハッシュコードを持つキーは同じバケットに現れます。これにより、個々の要素への高速なアクセスが可能になります。なぜなら、ハッシュが計算されると、その要素を含むバケットを参照するためです。

2つのキーは、それらのキーを渡されたときにマップのキー等価述語がtrueを返す場合、 等価 であると見なされます。2つのキーが等価である場合、ハッシュ関数は両方のキーに対して同じ値を返さなければなりません。

std::unordered_map Container AllocatorAwareContainer UnorderedAssociativeContainer の要件を満たします。

std::unordered_map のすべてのメンバ関数は constexpr です:定数式の評価中に std::unordered_map オブジェクトを作成および使用することが可能です。

ただし、 std::unordered_map オブジェクト自体は一般的に constexpr にはなりません。なぜなら、動的に確保されたストレージはすべて同じ定数式の評価内で解放されなければならないためです。

(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 >
struct /*unspecified*/
{
Iter     position ;
bool inserted ;
NodeType node ;
} ;

の特殊化で、テンプレート引数 iterator node_type
インスタンス化されたもの

メンバー関数

unordered_map を構築する
(公開メンバ関数)
unordered_map を破棄する
(public member function)
コンテナに値を代入する
(公開メンバ関数)
関連付けられたアロケータを返す
(公開メンバ関数)
イテレータ
先頭を指すイテレータを返す
(公開メンバ関数)
終端イテレータを返す
(公開メンバ関数)
容量
コンテナが空かどうかをチェックします
(公開メンバ関数)
要素数を返す
(公開メンバ関数)
格納可能な最大要素数を返す
(public member function)
修飾子
内容をクリアする
(公開メンバ関数)
要素を挿入する またはノード (C++17以降)
(公開メンバ関数)
要素の範囲を挿入する
(公開メンバ関数)
要素を挿入するか、キーが既に存在する場合は現在の要素に代入する
(公開メンバー関数)
要素をその場で構築する
(公開メンバ関数)
ヒントを使用して要素をその場で構築する
(public member function)
キーが存在しない場合はその場で挿入し、キーが存在する場合は何もしない
(公開メンバ関数)
要素を削除する
(公開メンバ関数)
内容を交換する
(公開メンバ関数)
(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内の値を比較する
(関数テンプレート)
std::swap アルゴリズムを特殊化する
(関数テンプレート)
特定の条件を満たす全ての要素を削除する
(関数テンプレート)

推論ガイド

(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++23)
2つのコンテナを適合させて、一意のキーでソートされたキーと値のペアのコレクションを提供
(クラステンプレート)