C++ unordered_multiset 容器
定义于头文件 <unordered_set>
之中,申明为:
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 不能用于比较二个 std::unordered_multiset ),除了关键比较等价(以 key_eq() 为比较器比较相等)的每组元素组成迭代顺序中的相接子范围,它可用 equal_range() 访问。
std::unordered_multiset 满足容器 (Container) 、具分配器容器 (AllocatorAwareContainer) 、无序关联容器 (UnorderedAssociativeContainer) 的要求
注:\color{red}注:注:
unordered_multiset
与 unordered_set
的最大区别就是前者可以容纳多个相同的值,后者容器中的元素具有唯一性,相同点是两者都是无序的。
unordered_multiset
与set
的最大区别是前者可以容纳多个相同的值并且容器内部无序,后者容器中的元素具有唯一性并且容器内部有序。
成员类型
成员类型 | 定义 |
---|---|
key_type | Key |
value_type | Key |
size_type | 无符号整数类型(通常是 std::size_t ) |
difference_type | 有符号整数类型(通常是 std::ptrdiff_t ) |
hasher | Hash |
key_equal | KeyEqual(C++20 前) |
Hash::transparent_key_equal | 若定义且它指名类型,否则为 KeyEqual(C++20 起) |
allocator_type | Allocator |
reference | value_type& |
const_reference | const value_type& |
pointer | std::allocator_traits::pointer |
const_pointer | std::allocator_traits::const_pointer |
iterator | 常向前迭代器 (LegacyForwardIterator) |
const_iterator | 常向前迭代器 |
local_iterator | 类别、值、差、指针和引用类型都与 iterator 相同的迭代器类型。能用此迭代器在单个桶迭代,但不能跨桶。 |
const_local_iterator | 类别、值、差、指针和引用类型都与 const_iterator 相同的迭代器类型。能用此迭代器在单个桶迭代,但不能跨桶。 |
node_type(C++17 起) | 表示容器结点的结点把柄特化 |
成员函数
(构造函数) | 构造 unordered_multiset (公开成员函数) |
(析构函数) | 析构 unordered_multiset (公开成员函数) |
operator= | 赋值给容器 (公开成员函数) |
get_allocator | 返回相关的分配器 (公开成员函数) |
迭代器
begin、cbegin | 返回指向容器第一个元素的迭代器 (公开成员函数) |
end、cend | 返回指向容器尾端的迭代器 (公开成员函数) |
示例:
#include<iostream>
#include<unordered_set>
using namespace std;
int main() {
unordered_multiset<int> myUnorededMultiSet = {
10,20,50,30,10,100,70,30,40 };