名前空間
変種
操作

std::unordered_map

From cppreference.com
< cpp‎ | container
 
 
 
 
ヘッダ <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以降)

目次

[編集] イテレータの無効化

操作 無効になる条件
全ての読み取り専用操作、swapstd::swap 決して無効化されない
clearrehashreserveoperator= 常に無効化される
insertemplaceemplace_hintoperator[] リハッシュを引き起こした場合のみ
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>
struct /*未規定*/
{
    Iter     position;
    bool     inserted;
    NodeType node;
};

テンプレート引数 iteratornode_type でインスタンス化される。[編集]

[編集] メンバ関数

unordered_map を構築する
(公開メンバ関数) [編集]
unordered_map を破棄する
(公開メンバ関数) [編集]
コンテナに値を代入する
(公開メンバ関数) [編集]
関連付けられたアロケータを返す
(公開メンバ関数) [編集]
イテレータ
先頭へのイテレータを返す
(public メンバ関数) [編集]
末尾へのイテレータを返す
(public メンバ関数) [編集]
容量
コンテナが空かどうかをチェックする
(public メンバ関数) [編集]
要素数を返す
(public メンバ関数) [編集]
可能な最大要素数を返す
(public メンバ関数) [編集]
変更
内容をクリアする
(公開メンバ関数) [編集]
要素 またはノード(C++17以降)を挿入する
(公開メンバ関数) [編集]
要素の範囲を挿入する
(公開メンバ関数) [編集]
要素を挿入するか、キーが既に存在する場合は現在の要素に代入する
(public member function) [編集]
要素を直接構築する
(公開メンバ関数) [編集]
ヒントを使用して要素を直接構築する
(公開メンバ関数) [編集]
キーが存在しない場合はインプレースで挿入し、キーが存在する場合は何もしない
(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++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 referenceconst_referencepointer
および const_pointer の定義が allocator_type に基づいていた
value_type および
std::allocator_traits に基づくように変更

[編集] 関連項目

キーでハッシュ化されたキーと値のペアのコレクション
(クラステンプレート) [編集]
キーでソートされたキーと値のペアのコレクション、キーは一意
(クラステンプレート) [編集]
(C++23)
ユニークなキーによってソートされたキーと値のペアのコレクションを提供するために2つのコンテナを適合させる
(クラステンプレート) [編集]
English 日本語 中文(简体) 中文(繁體)