std::
unordered_multiset
类模板 <unordered_set>
template < class Key, // unordered_multiset::key_type/value_type
class Hash = hash<Key>, // unordered_multiset::hasher
class Pred = equal_to<Key>, // unordered_multiset::key_equal
class Alloc = allocator<Key> // unordered_multiset::allocator_type
> class unordered_multiset;
无序多重集合
无序的多重集合是没有特定顺序存储元素的容器,允许基于值快速检索单个元素,
很像unordered_set容器,但允许不同的元素具有相同的值。
在 unordered_multiset 中,元素的值同时也是它的键,用于标识元素。
键是不可变的,因此 unordered_multiset 中的元素在容器中一次不能修改———但是可以插入和删除它们。
在内部,unordered_multiset 中的元素没有按照任何特定的顺序排序,而是根据它们的散列值将它们组织到
bucket 中,
从而允许直接通过它们的值快速访问单个元素(平均时间复杂度为恒定)。
相同的元素被组合在同一个bucket中,迭代器(参见equal_range)可以遍历所有元素。
容器中的迭代器至少是前向迭代器。
注意,这个容器没有定义在它自己的头文件中,而是与unordered_set共享头文件<unordered_set>。
☲ 容器特性
关联
关联容器中的元素是通过键引用的,而不是通过它们在容器中的绝对位置引用的。
无序
无序容器使用哈希表来组织元素,允许通过键快速访问元素。
set
元素的值也是用来标识它的键。
键不唯一
容器可以保存多个具有相同键的元素.
分配器
容器使用allocator 对象动态地处理其存储需求。。
☲ 模板参数
Key
元素的类型。unordered_multiset 容器中的每个元素也是由这个值标识的。
成员类型 unordered_multiset::key_type 和 unordered_multiset::value_type 的别名.
Hash
一种一元函数对象类型,它接受一个与元素类型相同的对象作为参数,并基于该对象返回size_t 类型的唯一值。
这可以是实现函数调用操作符的类,也可以是指向函数的指针(参见构造函数的示例)。
默认为 hash<Key> ,它返回一个哈希值,
冲突的概率接近 1.0/std::numeric_limits<size_t>::max() 。
unordered_multiset 对象使用此函数返回的哈希值在内部组织元素,加快查找单个元素的过程。
成员类型 unordered_multiset:: hashher 的别名.
Pred
一个二元谓词,接受两个与元素类型相同的参数,并返回布尔值。
表达式pred(a,b) ,其中pred 是该类型的一个对象,a 和b 是键值,
如果a 被认为与b 等价,则返回true 。
这可以是实现函数调用操作符的类,也可以是指向函数的指针(参见构造函数的示例)。
默认为equal_to<Key> ,其返回值与 等于运算符(a==b) 相同。
unordered_multiset对象使用这个表达式来确定两个元素键是否相等。
unordered_multiset容器支持具有相同键的多个元素。
成员类型 unordered_multiset::key_equal 的别名。
Alloc
用于定义存储分配模型的 allocator 对象的类型。 默认情况下,
使用 allocator 类模板,它定义了最简单的内存分配模型,并且与值无关。
别名为成员类型 unordered_multiset::allocator_type .
在unordered_multiset成员函数的引用中,这些相同的名称(
Key 、
Hash 、
Pred 和
Alloc )被假定为模板形参。
☉ 成员类型
以下是unordered_multiset的成员类型的别名。它们被广泛用作成员函数的形参和返回类型:
C++11
C++14
C++11:
成员类型
定义
注释
key_type
起始模板参数(Key)
value_type
起始模板参数(Key)
与key_type相同
hasher
第二个模板参数(Hash)
defaults to: hash<key_type>
key_equal
第三个模板参数(Pred)
默认为:equal_to <key_type>
allocator_type
第四个模板参数(Alloc)
默认为:allocator<value_type>
reference
Alloc::reference
const_reference
Alloc::const_reference
pointer
Alloc::pointer
默认分配器:value_type*
const_pointer
Alloc::const_pointer
默认分配器:const value_type*
iterator
指向const value_type的前向迭代器
* 可转换为const_iterator
const_iterator
指向const value_type的前向迭代器
*
local_iterator
指向const value_type的前向迭代器
* 可转换为const_local_iterator
const_local_iterator
指向const value_type的前向迭代器
*
difference_type
一种有符号整型
通常与ptrdiff_t相同
size_type
无符号整型
通常与size_t相同
C++14:
成员类型
定义
注释
key_type
起始模板参数(Key)
value_type
起始模板参数(Key)
与key_type相同
hasher
第二个模板参数(Hash)
defaults to: hash<key_type>
key_equal
第三个模板参数(Pred)
默认为:equal_to <key_type>
allocator_type
第四个模板参数(Alloc)
默认为:allocator<value_type>
reference
value_type&
const_reference
const value_type&
pointer
allocator_traits<Alloc>::pointer
默认分配器:value_type*
const_pointer
allocator_traits<Alloc>::const_pointer
默认分配器:const value_type*
iterator
指向const value_type的前向迭代器
* 可转换为const_iterator
const_iterator
指向const value_type的前向迭代器
*
local_iterator
指向const value_type的前向迭代器
* 可转换为const_local_iterator
const_local_iterator
指向const value_type的前向迭代器
*
difference_type
一种有符号整型
通常与ptrdiff_t相同
size_type
无符号整型
通常与size_t相同
*注意:unordered_multiset 中的所有迭代器都指向const 元素。
const_ 成员类型是否与非const 成员类型相同取决于特定的标准库实现,
但程序不应该依赖于它们与重载函数的不同:const_iterator 更通用,
因为迭代器总是可以转换为const_iterator 。
这同样适用于local_ 和非local_ 迭代器类型:它们可以是相同的类型,也可以不是,但程序不应该依赖于它们的不同。
☞ 成员函数
迭代器:
begin
返回一个指向unordered_multiset容器或其中一个桶开头的迭代器 (公众成员函数)
end
返回一个指向unordered_multiset容器或其中一个桶末尾元素的下一个元素的迭代器 (公众成员函数)
cbegin
返回一个指向unordered_multiset容器或其中一个桶开头的常量迭代器 (公众成员函数)
cend
返回一个指向unordered_multiset容器或其中一个桶末尾元素的下一个元素的常量迭代器 (公众成员函数)
容量:
查找元素:
修改器:
查看:
存储桶:
哈希策略:
非成员函数重载: