文章目录
-
- 测试环境
- unordered_set介绍
- 头文件
- 模块类定义
- 对象构造
- 初始化
- 元素访问
- 元素插入和删除
- 元素查找
- 容器大小
- 迭代器
- 元素交换
- 其他函数
测试环境
系统:ubuntu 22.04.2 LTS 64位
gcc版本:11.3.0
编辑器:vsCode 1.76.2
unordered_set介绍
- 关联式容器。
- 元素是唯一的,既是值又是键。
- 元素不能直接修改,需要先删除再插入。
- 支持单向迭代器。
- 插入元素时不会使迭代器失效,删除元素时会使指向已删除元素的迭代器失效。
- 插入、删除和查找元素时间复杂度为O(1),最坏情况下为O(n)。。
头文件
#include
模块类定义
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++)
{
std::cout <<*cItr<< " ";
}
std::cout<<std::endl;
std::cout << "unordersetTest:";
std::unordered_set<int>::iterator itr;
for (itr = unordersetTest.begin(); itr != unordersetTest.end(); itr++)
{
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};
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;
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表 |
注:桶即指的哈希桶,详情自行查找学习哈希算法相关知识。