Namespaces
Variants

std:: unordered_set

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

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

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

template <
class Key,
class Hash = std:: hash < Key > ,
class Pred = std:: equal_to < Key >
> using unordered_set = std :: unordered_set < Key, Hash, Pred,
std:: pmr :: polymorphic_allocator < Key >> ;

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

std::unordered_set は、型 Key の一意なオブジェクトの集合を格納する連想コンテナです。検索、挿入、削除の操作は平均的に定数時間の計算量を持ちます。

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

コンテナ要素は(非constイテレータによっても)変更してはなりません。変更によって要素のハッシュ値が変化し、コンテナが破損する可能性があるためです。

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

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

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

(C++26以降)

目次

イテレータの無効化

操作 無効化
すべての読み取り専用操作、 swap std::swap なし
clear rehash reserve operator= 常に
insert emplace emplace_hint リハッシュが発生した場合のみ
erase 削除された要素のみ

注記

  • swap関数はコンテナ内のイテレータを無効化しませんが、スワップ領域の終端を示すイテレータは無効化されます。
  • コンテナに格納されたデータへの参照とポインタは、対応するイテレータが無効化される場合でも、その要素が削除されることによってのみ無効化されます。
  • コンテナのムーブ代入後、互換性のないアロケータによって要素ごとのムーブ代入が強制されない限り、ムーブ元コンテナへの参照、ポインタ、およびイテレータ(終端イテレータを除く)は有効なままですが、現在は * this 内にある要素を参照します。

テンプレートパラメータ

メンバー型

定義
key_type Key
value_type Key
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以降) コンテナノードを表す 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_set を構築する
(公開メンバ関数)
unordered_set を破棄する
(公開メンバ関数)
コンテナに値を代入する
(公開メンバ関数)
関連付けられたアロケータを返す
(公開メンバ関数)
イテレータ
先頭を指すイテレータを返す
(公開メンバ関数)
終端を指すイテレータを返す
(公開メンバ関数)
容量
コンテナが空かどうかをチェックする
(公開メンバ関数)
要素数を返す
(public member function)
格納可能な最大要素数を返す
(公開メンバ関数)
修飾子
内容をクリアする
(公開メンバ関数)
要素を挿入する またはノード (C++17以降)
(公開メンバ関数)
要素の範囲を挿入する
(公開メンバ関数)
要素をその場で構築する
(公開メンバ関数)
ヒントを使用して要素をその場で構築する
(公開メンバ関数)
要素を削除する
(公開メンバ関数)
内容を交換する
(公開メンバ関数)
(C++17)
コンテナからノードを抽出する
(公開メンバ関数)
(C++17)
別のコンテナからノードをスプライスする
(公開メンバ関数)
ルックアップ
特定のキーに一致する要素の数を返す
(公開メンバ関数)
特定のキーを持つ要素を検索
(公開メンバ関数)
(C++20)
指定されたキーを持つ要素がコンテナに含まれているかどうかをチェックする
(公開メンバ関数)
指定されたキーに一致する要素の範囲を返す
(公開メンバ関数)
バケットインターフェース
指定されたバケットの先頭を指すイテレータを返す
(public member function)
指定されたバケットの終端を指すイテレータを返す
(public member function)
バケット数を返す
(公開メンバ関数)
バケットの最大数を返す
(public member function)
特定のバケット内の要素数を返す
(public member function)
指定されたキーのバケットを返す
(公開メンバー関数)
ハッシュポリシー
バケットあたりの平均要素数を返す
(公開メンバ関数)
バケットあたりの最大平均要素数を管理します
(公開メンバー関数)
指定された数のバケットを最低限確保し、ハッシュテーブルを再生成します
(公開メンバ関数)
指定された要素数以上の領域を確保し、ハッシュテーブルを再生成する
(public member function)
オブザーバー
キーをハッシュするために使用される関数を返す
(public member function)
キーの等価性を比較するために使用される関数を返します
(公開メンバー関数)

非メンバー関数

(C++11) (C++11) (removed in C++20)
unordered_set内の値を比較する
(関数テンプレート)
std::swap アルゴリズムを特殊化する
(関数テンプレート)
特定の条件を満たす全ての要素を削除する
(関数テンプレート)

推論ガイド

(C++17以降)

注記

メンバ型 iterator const_iterator は同じ型のエイリアスである可能性があります。これは、これら2つの型をパラメータ型として使用する関数オーバーロードのペアを定義すると、 One Definition Rule に違反する可能性があることを意味します。 iterator const_iterator に変換可能であるため、代わりに const_iterator をパラメータ型とする単一の関数が機能します。

機能テスト マクロ 標準 機能
__cpp_lib_containers_ranges 202202L (C++23) コンテナのためのレンジ構築と挿入
__cpp_lib_constexpr_unordered_set 202502L (C++26) constexpr std::unordered_set

#include <iostream>
#include <unordered_set>
void print(const auto& set)
{
    for (const auto& elem : set)
        std::cout << elem << ' ';
    std::cout << '\n';
}
int main()
{
    std::unordered_set<int> mySet{2, 7, 1, 8, 2, 8}; // intのセットを作成
    print(mySet);
    mySet.insert(5); // セットに要素5を挿入
    print(mySet);
    if (auto iter = mySet.find(5); iter != mySet.end())
        mySet.erase(iter); // iterが指す要素を削除
    print(mySet);
    mySet.erase(7); // 要素7を削除
    print(mySet);
}

出力例:

8 1 7 2
5 8 1 7 2
8 1 7 2
8 1 2

不具合報告

以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。

DR 適用対象 公開時の動作 正しい動作
LWG 2050 C++11 reference const_reference pointer
および const_pointer の定義は allocator_type に基づいていた
value_type
std::allocator_traits に基づく

関連項目

キーのコレクション、キーでハッシュ化
(クラステンプレート)
一意のキーのコレクション、キーでソート
(クラステンプレート)
(C++23)
コンテナを適応させて一意のキーのコレクションを提供、キーでソート
(クラステンプレート)