|
|
(1)
|
(C++11以降)
|
|
|
(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関数はコンテナ内のイテレータを無効化しませんが、スワップ領域の終端を示すイテレータは無効化されます。
-
コンテナに格納されたデータへの参照とポインタは、対応するイテレータが無効化される場合でも、その要素が削除されることによってのみ無効化されます。
-
コンテナのムーブ代入後、互換性のないアロケータによって要素ごとのムーブ代入が強制されない限り、ムーブ元コンテナへの参照、ポインタ、およびイテレータ(終端イテレータを除く)は有効なままですが、現在は
*
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
|
定数 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_setを構築する
(公開メンバ関数)
|
|
|
unordered_setを破棄する
(公開メンバ関数)
|
|
|
コンテナに値を代入する
(公開メンバ関数)
|
|
|
関連付けられたアロケータを返す
(公開メンバ関数)
|
イテレータ
|
|
|
先頭を指すイテレータを返す
(公開メンバ関数)
|
|
|
終端を指すイテレータを返す
(公開メンバ関数)
|
容量
|
|
|
コンテナが空かどうかをチェックする
(公開メンバ関数)
|
|
|
要素数を返す
(public member function)
|
|
|
格納可能な最大要素数を返す
(公開メンバ関数)
|
修飾子
|
|
|
内容をクリアする
(公開メンバ関数)
|
|
|
要素を挿入する
またはノード
(C++17以降)
(公開メンバ関数)
|
|
|
要素の範囲を挿入する
(公開メンバ関数)
|
|
|
要素をその場で構築する
(公開メンバ関数)
|
|
|
ヒントを使用して要素をその場で構築する
(公開メンバ関数)
|
|
|
要素を削除する
(公開メンバ関数)
|
|
|
内容を交換する
(公開メンバ関数)
|
|
|
コンテナからノードを抽出する
(公開メンバ関数)
|
|
|
別のコンテナからノードをスプライスする
(公開メンバ関数)
|
ルックアップ
|
|
|
特定のキーに一致する要素の数を返す
(公開メンバ関数)
|
|
|
特定のキーを持つ要素を検索
(公開メンバ関数)
|
|
|
指定されたキーを持つ要素がコンテナに含まれているかどうかをチェックする
(公開メンバ関数)
|
|
|
指定されたキーに一致する要素の範囲を返す
(公開メンバ関数)
|
バケットインターフェース
|
|
|
指定されたバケットの先頭を指すイテレータを返す
(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
アルゴリズムを特殊化する
(関数テンプレート)
|
|
|
特定の条件を満たす全ての要素を削除する
(関数テンプレート)
|
注記
メンバ型
iterator
と
const_iterator
は同じ型のエイリアスである可能性があります。これは、これら2つの型をパラメータ型として使用する関数オーバーロードのペアを定義すると、
One Definition Rule
に違反する可能性があることを意味します。
iterator
は
const_iterator
に変換可能であるため、代わりに
const_iterator
をパラメータ型とする単一の関数が機能します。
例
#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
に基づく
|
関連項目
|
|
キーのコレクション、キーでハッシュ化
(クラステンプレート)
|
|
|
一意のキーのコレクション、キーでソート
(クラステンプレート)
|
|
|
コンテナを適応させて一意のキーのコレクションを提供、キーでソート
(クラステンプレート)
|
|