1 はじめに
unordered_set
これは C++ 標準ライブラリのコンテナであり、一意の要素のコレクションを格納できます。このコンテナの特徴は、内部要素に特定の順序がないため、検索、挿入、削除の平均時間計算量が O(1) であることです。unordered_set
ハッシュテーブルに基づいて実装されているため、使用する場合はハッシュ関数と等価関数を提供する必要があります。
内部的にはunordered_set
、データは通常、ハッシュ テーブルに保存されます。ハッシュ テーブルはバケットで構成され、各バケットには同じハッシュ値を持つ要素が格納されます。ただし、これらの実装の詳細はクラス定義に隠されているため、ユーザーはこれらの詳細を気にする必要はありません。提供されたメンバー関数を使用して、要素の挿入、削除、検索、コンテナのサイズや負荷係数などのクエリなど、コンテナの状態を操作およびクエリすることができます。
unordered_set
主な機能の一部を次に示します。
-
非反復要素:
unordered_set
の各要素は一意です。つまり、重複する値は許可されません。 -
順序なし: 要素はコンテナ内に任意の順序で格納されません。これは、コンテナーを反復処理するときに、要素が特定の順序で表示されることを期待できないことを意味します。
-
高速な検索、挿入、および削除: ハッシュ テーブルに基づいた実装により、
unordered_set
検索、挿入、および削除の操作の平均時間複雑さは O(1) です。ただし、ハッシュ テーブルの負荷率が高い場合、これらの操作のパフォーマンスが低下する可能性があります。 -
カスタム ハッシュ関数と等価関数:
unordered_set
特定のデータ型とシナリオに合わせてカスタム ハッシュ関数と等価関数を提供できます。
簡単な使用例を次に示しますunordered_set
。
#include <iostream>
#include <unordered_set>
int main() {
// 创建一个整数类型的unordered_set
std::unordered_set<int> my_set;
// 插入元素
my_set.insert(10);
my_set.insert(20);
my_set.insert(30);
my_set.insert(40);
// 查找元素
auto search = my_set.find(20);
if (search != my_set.end()) {
std::cout << "Found " << *search << '\n';
} else {
std::cout << "Not found\n";
}
// 删除元素
my_set.erase(30);
// 遍历并打印元素
for (const int& x : my_set) {
std::cout << x << ' ';
}
return 0;
}
2. コンストラクター
unordered_set
さまざまな状況でコンテナーを作成および初期化するために、いくつかのコンストラクターが提供されています。一般的に使用されるコンストラクターをいくつか示しますunordered_set
。
1) デフォルトのコンストラクター: 空のコンストラクターを作成しますunordered_set
。
std::unordered_set<Key> my_set;
2) 範囲コンストラクター: 指定された範囲内の要素から 1 つを作成しますunordered_set
。範囲は 2 つの反復子 (通常begin()
は とend()
) で表されます。
std::unordered_set<Key> my_set(first_iterator, last_iterator);
3) リスト初期化コンストラクター: 初期化子リストを使用してコンストラクターを作成しますunordered_set
。
std::unordered_set<Key> my_set({key1, key2, key3});
4) コピー コンストラクター:別の からunordered_set
新しいコンストラクターを作成しunordered_set
、すべての要素をコピーします。
std::unordered_set<Key> my_set(other_set);
5) コンストラクターの移動:別の からunordered_set
新しいコンストラクターを作成しunordered_set
、すべての要素を移動します (コピーはしません)。
std::unordered_set<Key> my_set(std::move(other_set));
さらに、unordered_set
コンストラクターを使用すると、カスタム ハッシュ関数とキー比較関数に加えて、バケットの初期数などのパラメーターを指定できます。例えば:
std::unordered_set<Key, Hash, KeyEqual> my_set(
initial_bucket_count,
custom_hash_function,
custom_key_equal_function);
ここで、Key
は格納する要素の型、Hash
はハッシュ関数の型、KeyEqual
はキー比較関数の型です。initial_bucket_count
バケットの初期数を指定するパラメータです。custom_hash_function
と はcustom_key_equal_function
それぞれカスタム ハッシュ関数とキー比較関数のインスタンスです。
3. メンバー関数
unowned_set は、要素の挿入、削除、検索、コンテナーの状態のクエリなどの操作を実行できる一連のメンバー関数を提供します。以下は、unowned_set の一般的に使用されるメンバー関数の一部です。
begin() と end(): コンテナ内の最初と最後の要素の後の位置を指すイテレータを返します。
size(): コンテナ内の要素の数を返します。
empty(): コンテナが空かどうかを確認します。空の場合は true、それ以外の場合は false を返します。
max_size(): コンテナーが保持できる要素の最大数を返します。
insert(): 要素をコンテナに挿入します。要素がすでに存在する場合、その要素は挿入されません。
emplace(): 要素を構築して挿入します。insert() に似ていますが、コンストラクター パラメーターを直接使用できるため、余分なコピーまたは移動操作を回避できます。
Erase(): 指定された要素をコンテナから削除します。
clear(): コンテナ内のすべての要素を削除します。
find(): 指定されたキーを持つ要素がコンテナ内に存在するかどうかを検索します。要素が見つかった場合はイテレータを返し、それ以外の場合はコンテナの最後にイテレータを返します。
count(): 指定されたキーを持つ要素の数を返します。unowned_set の場合、結果は 0 または 1 のみになります。
bucket_count(): コンテナ内のバケットの数を返します。
load_factor(): コンテナの負荷係数を返します。負荷率は、バケット数に対する要素数の比率です。
max_load_factor(): コンテナの最大負荷係数を返すか設定します。実際の負荷率が最大負荷率を超えると、コンテナは自動的にバケットの数を増やします。
rehash(): コンテナ内のバケットの数を設定します。バケットの数が増加すると、コンテナは適切な負荷率を維持するために要素を再分散します。
reserve(): 再ハッシュせずに指定された数の要素を保持するために、コンテナーのバケットの最小数を設定します。