STL的unordered_multiset容器

1. std::unordered_multiset 的定义与特性

定义于头文件 ,类模板为:

template< class Key,
    class Hash = std::hash<Key>,
    class KeyEqual = std::equal_to<Key>,
    class Allocator = std::allocator<Key>
> class unordered_multiset;
  • unordered_multiset 是关联容器,含有可能非唯一 Key 类型对象的集合。搜索、插入和移除拥有平均常数时间复杂度。
  • 元素在内部并不以任何顺序排序,只是被组织到桶中。元素被放入哪个桶完全依赖其值的哈希。这允许快速访问单独的元素,因为一旦计算哈希,它就指代放置该元素的准确的桶。
  • 不要求此容器的迭代顺序稳定(故例如 std::equal 不能用于比较2个 std::unordered_multiset ),除了关键比较等价(以 key_eq() 为比较器比较相等)的每组元素组成迭代顺序中的相接子范围,它可用 equal_range() 访问。
  • std::unordered_multiset 满足容器 (Container) 、具分配器容器 (AllocatorAwareContainer) 、无序关联容器 (UnorderedAssociativeContainer) 的要求
  • 注意
    • unordered_multiset 与 unordered_set 的最大区别就是前者可以容纳多个相同的值,后者容器中的元素具有唯一性,相同点是两者都是无序的。
    • unordered_multiset 与set的最大区别是前者可以容纳多个相同的值并且容器内部无序,后者容器中的元素具有唯一性并且容器内部有序。

2. unordered_multiset 的常用函数以及初始化

2.1 迭代器

示例:

#include
#include
using namespace std;

int main() 
{
	unordered_multiset<int> myUnorededMultiSet = { 10,20,50,30,10,100,70,30,40 };
	//正向迭代器测试
	cout << "正向迭代器遍历容器:" << endl;
	for (auto it = myUnorededMultiSet.begin(); it != myUnorededMultiSet.end(); ++it) 
	{
		cout << *it << " ";
	}
	cout << endl;
	//正向常迭代器测试
	cout << "正向常迭代器遍历容器:" << endl;
	for (auto cit = myUnorededMultiSet.cbegin(); cit != myUnorededMultiSet.cend(); ++cit) 
	{
		cout << *cit << " ";
	}
	cout << endl;

	return 0;
}

输出结果:

正向迭代器遍历容器:
50 10 10 100 20 70 30 30 40
正向常迭代器遍历容器:
50 10 10 100 20 70 30 30 40

2.2 容量

empty:   检查容器是否为空 (公开成员函数)
size:    返回容纳的元素数 (公开成员函数)
max_size:返回可容纳的最大元素数 (公开成员函数)

示例:

#include
#include
using namespace std;

int main() 
{
	unordered_multiset<int> myUnorededMultiSet = { 10,20,50,30,10,100,70,30,40 };
	cout << "myUnorededMultiSet.empty() = " << myUnorededMultiSet.empty() << endl;
	cout << "myUnorededMultiSet.size() = " << myUnorededMultiSet.size() << endl;
	cout << "myUnorededMultiSet.max_size() = " << myUnorededMultiSet.max_size() << endl;

	return 0;
}

输出结果:

myUnorededMultiSet.empty() = 0
myUnorededMultiSet.size() = 9
myUnorededMultiSet.max_size() = 357913941

2.3 修改器

clear:         清除内容 (公开成员函数)
insert:        插入元素或结点 (C++17 起) (公开成员函数)
emplace:       原位构造元素 (公开成员函数)
emplace_hint:  使用提示原位构造元素 (公开成员函数)
erase:         擦除元素 (公开成员函数)
swap:          交换内容 (公开成员函数)
extract(C++17):从另一容器释出结点 (公开成员函数)
merge(C++17):  从另一容器接合结点 (公开成员函数)

示例:

#include
#include
using namespace std;

int main() 
{
	unordered_multiset<int> myUnorededMultiSet = { 10,20,50,30,10,100,70,30,40 };
	
	cout << "元素列表:" << endl;
	for (auto num : myUnorededMultiSet) 
	{
		cout << num << " ";
	}
	cout << endl;
	
	myUnorededMultiSet.insert(20);     //向容器插入20
	cout << "在容器插入20后,元素列表:" << endl;
	for (auto num : myUnorededMultiSet) 
	{
		cout << num << " ";
	}
	cout << endl;
	
	myUnorededMultiSet.erase(myUnorededMultiSet.begin());  //移除容器的首端
	cout << "在移除容器的首端后,元素列表:" << endl;
	for (auto num : myUnorededMultiSet) 
	{
		cout << num << " ";
	}
	cout << endl;
	
	myUnorededMultiSet.clear();   //清空容器
	cout << "清空容器后,元素列表:" << endl;
	for (auto num : myUnorededMultiSet) 
	{
		cout << num << " ";
	}
	cout << endl;

	return 0;
}

输出结果:

元素列表:
50 10 10 100 20 70 30 30 40
在容器插入20后,元素列表:
50 10 10 100 20 20 70 30 30 40
在移除容器的首端后,元素列表:
10 10 100 20 20 70 30 30 40
清空容器后,元素列表:

2.4 查找

count:          返回匹配特定键的元素数量 (公开成员函数)
find:           寻找带有特定键的元素 (公开成员函数)
contains(C++20):检查容器是否含有带特定关键的元素 (公开成员函数)
equal_range:    返回匹配特定键的元素范围 (公开成员函数)

示例:

#include
#include
using namespace std;

int main() 
{
	unordered_multiset<int> myUnorededMultiSet = { 10,20,50,30,10,100,70,30,40 };

	cout << "myMultiSet元素表列:" << endl;
	for (auto num : myUnorededMultiSet) 
	{
		cout << num << " ";
	}
	cout << endl;

	cout << "myUnorededMultiSet.count(100) = " << myUnorededMultiSet.count(100) << endl;
	cout << "myUnorededMultiSet.find(20) == myUnorededMultiSet.end() ? " 
		<< (myUnorededMultiSet.find(20) == myUnorededMultiSet.end()) << endl;
	
	cout << "键 == 30 对应的值:" << endl;
	pair<unordered_set<int>::iterator, unordered_set<int>::iterator> myRange;
	myRange = myUnorededMultiSet.equal_range(30);
	for (auto it = myRange.first; it != myRange.second; ++it) 
	{
		cout << *it << " ";
	}
	cout << endl;

	return 0;
}

输出结果:

myMultiSet元素表列:
50 10 10 100 20 70 30 30 40
myUnorededMultiSet.count(100) = 1
myUnorededMultiSet.find(20) == myUnorededMultiSet.end() ? 0
键 == 30 对应的值:
30 30

2.5 桶(篮子)接口

begin(size_type)、cbegin(size_type):  返回一个迭代器,指向指定的桶的开始 (公开成员函数)
end(size_type)、cend(size_type):      返回一个迭代器,指向指定的桶的末尾 (公开成员函数)
bucket_count:                         返回桶数 (公开成员函数)
max_bucket_count:                     返回桶的最大数量 (公开成员函数)
bucket_size:                          返回在特定的桶中的元素数量 (公开成员函数)
bucket:                               返回带有特定键的桶 (公开成员函数)

2.6 哈希策略

load_factor:    返回每个桶的平均元素数量 (公开成员函数)
max_load_factor:管理每个桶的平均元素数量的最大值 (公开成员函数)
rehash:         为至少为指定数量的桶预留存储空间。这会重新生成哈希表。 (公开成员函数)
reserve:        为至少为指定数量的元素预留存储空间。这会重新生成哈希表。 (公开成员函数)

2.7 观察器

hash_function:  返回用于对关键哈希的函数 (公开成员函数)
key_eq:         返回用于比较键的相等性的函数 (公开成员函数)

你可能感兴趣的:(C++,c++,开发语言)