std::unordered_set
| ヘッダー <unordered_set> で定義 |
||
| template< class Key, |
(1) | (C++11以降) |
| namespace pmr { template< |
(2) | (C++17以降) |
std::unordered_set は、ユニークな Key 型のオブジェクトの集合を格納する連想コンテナである。検索、挿入、削除は平均して定数時間の計算量を持つ。
内部的に、要素は特定の順序でソートされず、バケットに編成される。どのバケットに要素が配置されるかは、その値のハッシュに完全に依存する。これにより、ハッシュが計算されると、それは要素が配置される正確なバケットを指すため、個々の要素への高速なアクセスが可能になる。
コンテナの要素は、たとえ非constなイテレータであっても変更してはならない。なぜなら、変更によって要素のハッシュが変わり、コンテナが破損する可能性があるからである。
std::unordered_set は コンテナ (Container), アロケータ認識コンテナ (AllocatorAwareContainer), 非順序連想コンテナ (UnorderedAssociativeContainer) の要件を満たす。
|
|
(C++26以降) |
目次 |
[編集] イテレータの無効化
| 操作 | 無効になる条件 |
|---|---|
| すべての読み取り専用操作、swap、std::swap | 無効にならない |
| clear、rehash、reserve、operator= | 常に無効になる |
| insert、emplace、emplace_hint | リハッシュを引き起こした場合のみ無効になる |
| erase | 削除された要素を指すもののみ無効になる |
[編集] 注釈
- swap 関数はコンテナ内のどのイテレータも無効にしないが、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以降) |
コンテナのノードを表す ノードハンドル の特殊化 |
insert_return_type (C++17 以降) |
node_type の挿入結果を記述する型。以下の特殊化であるtemplate<class Iter, class NodeType> |
[編集] メンバ関数
unordered_set を構築する(公開メンバ関数) | |
unordered_set を破棄する(公開メンバ関数) | |
| コンテナに値を代入する (公開メンバ関数) | |
| 関連付けられたアロケータを返す (公開メンバ関数) | |
イテレータ | |
| 先頭へのイテレータを返す (public メンバ関数) | |
| 末尾へのイテレータを返す (public メンバ関数) | |
容量 | |
| コンテナが空かどうかをチェックする (public メンバ関数) | |
| 要素数を返す (public メンバ関数) | |
| 可能な最大要素数を返す (public メンバ関数) | |
変更 | |
| 内容をクリアする (公開メンバ関数) | |
| 要素 またはノード(C++17以降)を挿入する (公開メンバ関数) | |
| (C++23) |
要素の範囲を挿入する (公開メンバ関数) |
| 要素を直接構築する (公開メンバ関数) | |
| ヒントを使用して要素を直接構築する (公開メンバ関数) | |
| 要素を削除する (公開メンバ関数) | |
| 内容を交換する (public メンバ関数) | |
| (C++17) |
コンテナからノードを抽出する (公開メンバ関数) |
| (C++17) |
他のコンテナからノードを連結する (公開メンバ関数) |
検索 | |
| 特定のキーに一致する要素の数を返す (公開メンバ関数) | |
| 特定のキーを持つ要素を検索する (公開メンバ関数) | |
| (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_set 内の値を比較する (function template) |
| std::swap アルゴリズムを特殊化する (関数テンプレート) | |
| (C++20) |
特定の基準を満たすすべての要素を削除する (関数テンプレート) |
推論補助 |
(C++17以降) |
[編集] 注釈
メンバ型 iterator と const_iterator は同じ型へのエイリアスかもしれない。これは、これら2つの型をパラメータ型として使用する関数オーバーロードのペアを定義すると、ODR (One Definition Rule) に違反する可能性があることを意味する。iterator は const_iterator に変換可能なので、代わりに const_iterator をパラメータ型として持つ単一の関数が機能する。
| 機能テストマクロ | 値 | 規格 | 機能 |
|---|---|---|---|
__cpp_lib_containers_ranges |
202202L |
(C++23) | コンテナのRangeコンストラクタとRange挿入 |
__cpp_lib_constexpr_containers |
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}; // creates a set of ints print(mySet); mySet.insert(5); // puts an element 5 in the set print(mySet); if (auto iter = mySet.find(5); iter != mySet.end()) mySet.erase(iter); // removes an element pointed to by iter print(mySet); mySet.erase(7); // removes an element 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++11) |
キーのコレクション、キーによってハッシュ化される (class template) |
| ユニークなキーのコレクション、キーによってソートされる (class template) | |
| (C++23) |
ユニークなキーのコレクションを提供するためにコンテナを適応させる、キーによってソートされる (class template) |