测试环境
系统:ubuntu 22.04.2 LTS 64位
gcc版本:11.3.0
编辑器:vsCode 1.76.2
unordered_multiset介绍
- 关联式容器。
- 每个元素都包含一个键和对应的值,键即是值。
- 元素是无序的。
- 相同键值可以有多个。
- 支持单向迭代器。
- 插入元素时不会使迭代器失效,删除元素时会使指向已删除元素的迭代器失效。
- 插入、删除和查找元素时间复杂度为O(1),最坏情况下为O(n)。
头文件
#include <unordered_set>
模块类定义
template<typename _Value,
typename _Hash = hash<_Value>,
typename _Pred = equal_to<_Value>,
typename _Alloc = allocator<_Value>>
class unordered_multiset{};
_Value:表示存储的值数据类型
_Hash:哈希函数对象类型
_Pred:表示按照键的排序方式。
_Alloc:表示所存储分配器的类型,负责元素内存的分配和释放。可选参数,一般不使用。
对象构造
std::unordered_multiset<std::string> unordermultiset1;
std::unordered_multiset<std::string> unordermultiset2(10);
std::unordered_multiset<std::string> unordermultiset3(unordermultiset1);
std::unordered_multiset<std::string> unordermultiset4(std::move(unordermultiset1));
std::unordered_multiset<std::string> unordermultiset5({"one","two","three","four","one"});
std::unordered_multimap<int,std::string> unordermultimap6(++unordermultimap5.begin(), unordermultimap5.end());
初始化
std::unordered_multiset<std::string> unordermultisetTest({"one","two","three","two","five","six"});
元素访问
不支持at()和[]访问元素。
元素插入和删除
函数 | 返回值 | 功能 |
---|
clear() | 无 | 清空所有元素 |
erase() | 迭代器或删除元素数量 | 清除指定位置的一个元素、通过迭代器指定范围内的元素或通过键删除值 |
emplace() | 迭代器 | 插入元素,并返回被插入元素的位置。 |
emplace_hint() | 迭代器 | 插入元素,并返回新插入元素的迭代器。 |
insert() | 迭代器 | 1)在指定位置插入1个元素。2)复制通过迭代器指定范围的元素。3)通过初始化列表插入元素。4)直接插入元素。 |
std::unordered_multiset<std::string>::iterator itr1 = unordermultisetTest.emplace("one");
std::cout << "emplace value is "<<*itr1<<std::endl;
std::string str1("two");
std::unordered_multiset<std::string>::iterator itr2 = unordermultisetTest.emplace(std::move(str1));
std::cout << "itr2 value is "<<*itr2<<std::endl;
std::unordered_multiset<std::string>::iterator itr3 = unordermultisetTest.emplace_hint(++unordermultisetTest.begin(),"three");
std::cout << "itr3 value is "<<*itr3<<std::endl;
std::unordered_multiset<std::string>::iterator itr4 = unordermultisetTest.erase(unordermultisetTest.begin());
std::cout << "itr4 value is "<<*itr4<<std::endl;
std::unordered_multiset<std::string>::iterator itr5 = unordermultisetTest.erase(unordermultisetTest.begin(), ++unordermultisetTest.begin());
std::cout << "itr5 value is "<<*itr5<<std::endl;
int iCount = unordermultisetTest.erase("one");
std::cout << "erace element count is "<<iCount<<std::endl;
unordermultisetTest.clear();
std::unordered_multiset<std::string>::iterator itr6 = unordermultisetTest.insert("one");
std::cout << "itr6 value is "<<*itr6<<std::endl;
std::string str2 = "three";
std::unordered_multiset<std::string>::iterator itr7 = unordermultisetTest.insert(std::move(str2));
std::cout << "itr7 value is "<<*itr7<<std::endl;
std::unordered_multiset<std::string>::iterator itr8 = unordermultisetTest.insert(unordermultisetTest.begin(),"three");
std::cout << "itr8 value is "<< *itr8 <<std::endl;
std::string str3 = "four";
std::unordered_multiset<std::string>::iterator itr9 = unordermultisetTest.insert(++unordermultisetTest.begin(),std::move(str3));
std::cout << "itr9 value is "<< *itr9 <<std::endl;
unordermultisetTest.insert({"one","two","three"});
std::unordered_multiset<std::string> unordermultiset8{"three","four"};
unordermultisetTest.insert(unordermultiset8.begin(),unordermultiset8.end());
元素查找
函数 | 返回值 | 功能 |
---|
count() | std::size_t | 返回给定键对应元素的数量 |
find() | 迭代器 | 查找指定键对应元素的位置,未找到则返回end() |
equal_range() | 键值对 | 查找与指定键匹配的范围 |
std::cout<<unordermultisetTest.count("one")<<std::endl;
std::unordered_multiset<std::string>::iterator itr10 = unordermultisetTest.find("one");
std::cout<<"find value is "<<*itr10<<std::endl;
std::pair<std::unordered_multiset<std::string>::iterator, \
std::unordered_multiset<std::string>::iterator> pair4 = unordermultisetTest.equal_range("one");
for (; pair4.first != pair4.second; pair4.first++ )
{
std::cout << *pair4.first << " ";
}
容器大小
函数 | 返回值 | 功能 |
---|
size() | std::size_t | 获取当前容器中的元素数量 |
empty() | bool | 判断当前容器是否为空,为空返回true,否则返回false |
max_size() | std::size_t | 返回容器的最大容量 |
unordermultisetTest = {"one","two","three","four","five"};
std::cout<<unordermultisetTest.size()<<std::endl;
std::cout<<unordermultisetTest.max_size()<<std::endl;
std::cout<<std::boolalpha<<unordermultisetTest.empty()<<std::endl;
迭代器
类型 | 功能 |
---|
iterator | 正向访问迭代器。从前向后访问元素,可以读取也可以修改 |
const_iterator | 常量正向访问迭代器。从前向后访问元素,只能读取不能修改 |
函数 | 返回值 | 功能 |
---|
begin() | 正向访问迭代器 | 返回指向unorder_multiset对象首元素所在位置的迭代器 |
end() | 正向访问迭代器 | 返回指向unorder_multiset对象末尾元素的下一个位置的迭代器 |
cbegin() | 常量正向访问迭代器 | 返回指向unorder_multiset对象首元素所在位置的常量迭代器 |
cend() | 常量正向访问迭代器 | 返回指向unorder_multiset对象末尾元素的下一个位置的迭代器 |
std::unordered_multiset<std::string> unordermultisetTest({"one","two","three","two","five","six"});
std::unordered_multiset<std::string>::const_iterator cItr;
for (cItr = unordermultisetTest.cbegin(); cItr != unordermultisetTest.cend(); cItr++)
{
std::cout << *cItr << " ";
}
std::cout<<std::endl;
std::unordered_multiset<std::string>::iterator itr;
for (itr = unordermultisetTest.begin(); itr != unordermultisetTest.end(); itr++)
{
std::cout << *itr << " " ;
}
std::cout<<std::endl;
元素交换
std::unordered_multiset<std::string> unordermultisetSwap1 = {"one","two","three"};
std::unordered_multiset<std::string> unordermultisetSwap2 = {"four","five","six"};
unordermultisetSwap1.swap(unordermultisetSwap2);
std::cout << "unordermultisetSwap1: ";
for (auto &item : unordermultisetSwap1)
{
std::cout<<item<<" ";
}
std::cout << std::endl;
std::cout << "unordermultisetSwap2: ";
for (auto &item : unordermultisetSwap2)
{
std::cout<<item<<" ";
}
std::swap(unordermultisetSwap1,unordermultisetSwap2);
std::cout << std::endl;
std::cout << "unordermultisetSwap1: ";
for (auto &item : unordermultisetSwap1)
{
std::cout<<item<<" ";
}
std::cout << std::endl;
std::cout << "unordermultisetSwap2: ";
for (auto &item : unordermultisetSwap2)
{
std::cout<<item<<" ";
}
其他函数
函数名 | 返回值 | 功能 |
---|
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表 |
注:桶即指的哈希桶,详情自行查找学习哈希算法相关知识。