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()函数和下标运算符访问元素

元素插入和删除

函数 返回值 功能
clear() 清空所有元素
erase() 迭代器或删除元素数量 清除指定位置的一个元素、通过迭代器指定范围内的元素或通过键删除值
emplace() 键值对 插入元素。插入成功时第一个元素是指向新插入元素的迭代器,失败时第一个元素是指向以存在元素的迭代器,第二个元素表示插入结果,true成功,false失败。
emplace_hint() 迭代器 插入成功返回新插入元素的迭代器,插入失败时返回已存在元素的迭代器
insert() 键值对、迭代器、无 1)在指定位置插入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());

元素查找

函数 返回值 功能
count() std::size_t 返回给定键对应元素的数量
find() 迭代器 查找指定键对应元素的位置,未找到则返回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;
}

容器大小

函数 返回值 功能
size() std::size_t 获取当前容器中的元素数量
empty() bool 判断当前容器是否为空,为空返回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;

迭代器

类型 功能
iterator 正向访问迭代器。从前向后访问元素,可以读取也可以修改
const_iterator 常量正向访问迭代器。从前向后访问元素,只能读取不能修改
函数 返回值 功能
begin() 正向访问迭代器 返回指向unordered_set对象首元素所在位置的迭代器
end() 正向访问迭代器 返回指向unordered_set对象末尾元素的下一个位置的迭代器
cbegin() 常量正向访问迭代器 返回指向unordered_set对象首元素所在位置的常量迭代器
cend() 常量正向访问迭代器 返回指向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;

元素交换

函数名 返回值 功能
swap() 交换两个容器的元素
/*交互两个容器元素的值,无返回值*/
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;

其他函数

函数名 返回值 功能
bucket() std::size_type 获取给定键对应的存储桶的编号
bucket_count() std::size_type 获取hash表的存储桶的总数量
bucket_size() std::size_type 根据存储桶的编号获取存储桶的大小
load_factor() float 获取每个存储桶的平均元素数量
max_bucket_count() std::size_type 获取当前允许的最大存储桶数量
max_load_factor() float或无 获取或者设置每个存储桶的最大元素数量
rehash() 根据指定的存储桶数量重新生成hash表

注:桶即指的哈希桶,详情自行查找学习哈希算法相关知识。

猜你喜欢

转载自blog.csdn.net/qq_35699583/article/details/129967084