STLコンテナの<unordered_set>

テスト環境

システム: ubuntu 22.04.2 LTS 64 ビット
gcc バージョン: 11.3.0
エディター: vsCode 1.76.2

unordered_set の概要

  1. 連想コンテナ。
  2. 要素は一意であり、値とキーの両方です。
  3. 要素を直接変更することはできません。削除してから挿入する必要があります。
  4. 一方向反復子がサポートされています。
  5. 要素が挿入されても反復子は無効化されず、削除された要素を指す反復子は要素が削除されても無効化されます。
  6. 要素の挿入、削除、検索の時間の複雑さは O(1)、最悪の場合は O(n) です。.

ヘッドファイル

#include <map>

モジュールクラス定義

  template<typename _Value, 
  	   typename _Hash = hash<_Value>,
  	   typename _Pred = equal_to<_Value>,
	   typename _Alloc = allocator<_Value>>
    class unordered_set{
    
    };

_Value: 格納するデータ型を示します。
_Hash: ハッシュ関数オブジェクト型を
示します。 _Pred: キーによるソート方法を示します。
_Alloc: 要素メモリの割り当てと解放を担当する格納されたアロケータのタイプを示します。オプションのパラメーターで、通常は使用されません。

オブジェクトの構築

 std::unordered_set<int> unorderset2(10);
/*拷贝构造函数*/
std::unordered_set<int> unorderset3(unorderset1);
/*移动构造函数*/
std::unordered_set<int> unorderset4(std::move(unorderset1));
/*初始化列表构造函数*/
std::unordered_set<int> unorderset5({
    
    6,1,2,5,4,3,8});
/*初始化列表+最小桶数量 构造函数*/
std::unordered_set<int> unorderset6({
    
    6,1,2,5,4,3,8},10);
/*指定迭代器范围构造函数*/
std::unordered_set<int> unorderset7(++unorderset5.begin(), unorderset5.end());
/*指定迭代器范围+指定最小桶数量构造函数*/
std::unordered_set<int> unorderset8(++unorderset5.begin(), unorderset5.end(),10);

初期化

/*初始化列表初始化元素*/
set1 = {
    
    1,3,5,4,2};

要素アクセス

at() 関数と添え字演算子は、要素へのアクセスではサポートされていません

要素の挿入と削除

関数 戻り値 関数
クリア() なし すべての要素をクリア
消去() イテレータまたは削除された要素の数 指定した位置の要素、イテレータで指定した範囲の要素、キーで値をクリアする
場所() キーと値のペア 要素を挿入します。挿入が成功した場合、最初の要素は新しく挿入された要素を指すイテレータです。失敗した場合、最初の要素は既存の要素を指すイテレータで、2 番目の要素は挿入結果を表します。true は成功し、false は失敗します。 .
emplace_hint() イテレータ 挿入が成功した場合は新しく挿入された要素の反復子が返され、挿入が失敗した場合は既存の要素の反復子が返されます
入れる() キーと値のペア、反復子、なし 1) 指定された位置に要素を挿入します。2) イテレータで指定された範囲の要素をコピーします。3) 初期化子リストを介して要素を挿入します。4) 要素を直接挿入します。
/*直接构造并插入元素*/
std::pair<std::unordered_set<int>::iterator,bool> pair1 = unordersetTest.emplace(6);
std::cout << "emplace result is "<<std::boolalpha<<pair1.second<<std::endl;
std::cout << "pair1 iterator value is "<<*pair1.first<<std::endl;

/*使用移动语句插入元素*/
int iValue = 8;
std::pair<std::unordered_set<int>::iterator,bool> pair3 = unordersetTest.emplace(std::move(iValue));
std::cout << "emplace result is "<<std::boolalpha<<pair3.second<<std::endl;
std::cout << "pair3 iterator value is "<<*pair3.first<<std::endl;

/*直接构造并在指定位置插入元素*/
std::unordered_set<int>::iterator itr1 = unordersetTest.emplace_hint(++unordersetTest.begin(),1);
std::cout << "itr1 value is "<<*itr1;

/*删除单个元素*/
std::unordered_set<int>::iterator itr2 = unordersetTest.erase(unordersetTest.begin());
std::cout << "itr2 alue is "<<*itr2<<std::endl;

/*删除指定范围的元素*/
std::unordered_set<int>::iterator itr3 = unordersetTest.erase(unordersetTest.begin(), ++unordersetTest.begin());
std::cout << "itr3 value is "<<*itr3<<std::endl;

/*根据键值删除元素*/
int iCount = unorderset1.erase(1);
std::cout << "erace element count is "<<iCount<<std::endl;

/*清空元素*/
unordersetTest.clear();

/*插入元素,返回键值对*/
std::pair<std::unordered_set<int>::iterator,bool> pair4 = unordersetTest.insert(3);
std::cout << "insert result is "<<std::boolalpha<<pair4.second<<std::endl;
std::cout << "pair4 iterator value is "<<*pair4.first<<std::endl;

/*使用移动语句插入元素,返回键值对*/
int iValue2 = 7;
std::pair<std::unordered_set<int>::iterator,int> pair6 = unordersetTest.insert(std::move(iValue2));
std::cout << "insert result is "<<std::boolalpha<<pair6.second<<std::endl;
std::cout << "pair6 iterator value is "<<*pair6.first<<std::endl;

/*插入元素,返回迭代器*/
std::unordered_set<int>::iterator itr4 = unordersetTest.insert(unordersetTest.begin(),9);
std::cout << "insert value is "<< *itr4<<std::endl;

/*使用移动语句插入元素,返回迭代器*/
int iValue1 = 2;
std::unordered_set<int>::iterator itr5 = unordersetTest.insert(unordersetTest.begin(),std::move(iValue1));
std::cout << "insert value is "<< *itr5<<std::endl;

/*初始化列表插入,无返回值*/
unordersetTest.insert({
    
    5,7,6});

/*使用迭代器指定范围插入元素,无返回值*/
std::unordered_set<int> unorderset9({
    
    11,12});
unordersetTest.insert(unorderset9.begin(),unorderset9.end());

要素検索

関数 戻り値 関数
カウント() std::size_t 指定されたキーに対応する要素の数を返します
探す() イテレータ 指定されたキーに対応する要素の位置を検索し、見つからない場合は end() を返します
equal_range() キーと値のペア 指定された要素に一致する範囲を取得します。存在しない場合、キーと値のペアは end() です。
/*判断某个键对应值的数量*/
std::cout<<unordersetTest.count(3)<<std::endl;
/*查找指定键的元素所在的位置*/
std::unordered_set<int>::iterator itr6 = unordersetTest.find(4);
std::cout<<"find value is "<<*itr6<<std::endl;
/*返回给定键的范围*/
std::pair<std::unordered_set<int>::iterator,std::unordered_set<int>::iterator> ret7 = unorderset1.equal_range(1);
if (unorderset1.end() != ret7.first)
{
    
    
    std::cout<<"first value is "<<*ret7.first<<std::endl;
}
if (unorderset1.end() != ret7.second)
{
    
    
    std::cout<<"second value is "<<*ret7.second<<std::endl;
}

コンテナサイズ

関数 戻り値 関数
サイズ() std::size_t 現在のコンテナ内の要素数を取得する
空() ブール 現在のコンテナが空かどうかを判断し、空の場合は true を返し、そうでない場合は false を返します
max_size() std::size_t コンテナの最大容量を返します
unordersetTest = {
    
    1,2,5,4,3};
/*判断元素的数量*/
std::cout<<unordersetTest.size()<<std::endl;
/*判断容器最大能容纳的元素的数量*/
std::cout<<unordersetTest.max_size()<<std::endl;
/*判断容器是否为空*/
std::cout<<std::boolalpha<<unordersetTest.empty()<<std::endl;

イテレータ

タイプ 関数
イテレータ 前方アクセス反復子。前面から背面へ要素にアクセスし、読み取りまたは変更可能
const_iterator 定数前方アクセス反復子。前から後ろへ要素にアクセスし、読み取りのみで変更はしない
関数 戻り値 関数
始める() 前方アクセス反復子 unordered_set オブジェクトの最初の要素の位置を指す反復子を返します
終わり() 前方アクセス反復子 unordered_set オブジェクトの末尾にある要素の次の位置を指す反復子を返します
cbegin() const 前方アクセス反復子 unordered_set オブジェクトの最初の要素の位置を指す定数反復子を返します
いくつか() const 前方アクセス反復子 unordered_set オブジェクトの末尾にある要素の次の位置を指す反復子を返します
std::unordered_set<int> unordersetTest({
    
    6,7,8,9,10,1,2,3,4,5});
/*常量正向随机访问迭代器*/
std::cout << "unordersetTest:";
std::unordered_set<int>::const_iterator cItr;
for (cItr = unordersetTest.cbegin(); cItr != unordersetTest.cend(); cItr++)
{
    
    
    /* 不允许修改值,编译报错 */
    //*itr += 10; 
    /* 访问元素 */
    std::cout <<*cItr<< " ";
}
std::cout<<std::endl;
/*正向随机访问迭代器,每个元素+10*/
std::cout << "unordersetTest:";
std::unordered_set<int>::iterator itr;
for (itr = unordersetTest.begin(); itr != unordersetTest.end(); itr++)
{
    
    
    /* 不允许修改值,编译报错 */
    /*itr += 10; 
    /* 访问元素 */
    std::cout <<*itr << " ";
}
std::cout<<std::endl;

エレメント交換

関数名 戻り値 関数
スワップ() なし 2 つのコンテナの要素を交換します
/*交互两个容器元素的值,无返回值*/
std::unordered_set<int> unordersetSwap1 = {
    
    1,2,3,4,5};
std::unordered_set<int> unordersetSwap2 = {
    
    6,7,8,9,10};
/*方式1, unordersetSwap1={6,7,8,9,10}, unordersetSwap2={1,2,3,4,5}*/
unordersetSwap1.swap(unordersetSwap2);
std::cout << "unordersetSwap1: "<<std::endl;
for (auto &item : unordersetSwap1)
{
    
    
    std::cout<<" "<<item;
}
std::cout << std::endl;
std::cout << "unordersetSwap2: "<<std::endl;
for (auto &item : unordersetSwap2)
{
    
    
    std::cout<<" "<<item;
}
std::cout << std::endl;
/*unordersetSwap1={1,2,3,4,5}, unordersetSwap2={6,7,8,9,10}*/
std::swap(unordersetSwap1,unordersetSwap2);
std::cout << "unordersetSwap1: "<<std::endl;
for (auto &item : unordersetSwap1)
{
    
    
    std::cout<<" "<<item;
}
std::cout << std::endl;
std::cout << "unordersetSwap2: "<<std::endl;
for (auto &item : unordersetSwap2)
{
    
    
    std::cout<<" "<<item;
}
std::cout << std::endl;

その他の機能

関数名 戻り値 関数
バケツ() std::size_type 指定されたキーに対応するバケットの番号を取得します
バケット数() std::size_type ハッシュ テーブル内のバケットの総数を取得する
バケットサイズ() std::size_type バケットの数に基づいてバケットのサイズを取得します
負荷率() 浮く バケットあたりの要素の平均数を取得する
max_bucket_count() std::size_type 現在許可されているバケットの最大数を取得する
max_load_factor() float または None バケットあたりの要素の最大数を取得または設定します
再ハッシュ() なし 指定されたバケット数に従ってハッシュ テーブルを再生成します

注: バケットはハッシュ バケットを指します. 詳細については、ハッシュ アルゴリズムの関連知識を自分で見つけることができます.

おすすめ

転載: blog.csdn.net/qq_35699583/article/details/129967084