目录
1、无序容器原理
之前说过的map 与 set在存储上都是有序的,即是按照关键字的值排序的:如果键的类型是数字,则按照数字大小进行排序,如果是 string,则按照字典序进行排序。
C++新标准在头文件 <unordered_map > 中定义了四种无序关联容器(unordered_map、unordered_set、unordered_multimap、unordered_multiset),这些容器不再是使用比较运算符来组织元素,而是使用一个哈希函数和关键字类型的==运算符。在关键字类型的元素没有明显的序关系的情况下,无序容器是非常有用的。在某些应用中,维护元素的代价非常高昂,此时无序容器也很有用。
除了哈希管理操作外,无序容器提供了与有序容器相同的操作(如 find、insert等),也就是说我们曾用于 map 和 set 的操作也能用于 unordered_map 以及 unordered_set。类似地,无序容器也有可以重复关键字的 multi 版本。
2、无序容器操作
无序容器在组织上是一组桶。每个桶存储零个或多个元素。无序容器使用一个哈希函数将元素映射到桶,为了访问一个元素,容器首先计算元素的哈希值,他指出应该搜索哪个桶。
理想情况下哈希函数将每个特定的值映射到唯一的桶。但是将不同关键字的元素映射到相同的桶也是允许的。当一个桶保存多个元素时,需要顺序搜索这些元素来查找我们想要的那个。
无序容器提供了一组桶管理函数,这些成员函数允许我们查询容器的状态以及在必要时强制容器进行重组。
"1、桶接口"
c.bucket_count() // 返回正在使用的桶的数量
c.max_bucket_count() // 容器能容纳的最多的桶的数量
c.bucket_size(n) // 第n个桶中有多少个元素
c.bucket(key) // 关键字为key的元素在那个桶中
"2、桶迭代"
local_iterator // 可以用来访问桶中元素的迭代器类型
const_local_iterator // 桶迭代器的const类型
c.begin(n), c.end(n) // 桶n的首元素迭代器和尾元素迭代器
c.cbegin(n), c.cend(n) // 桶n的首元素迭代器和尾元素迭代器,返回的时const类型,只读类型,不能修改其指向元素的值
"3、哈希策略"
c.load_factor() // 每个桶的平均元素数量,返回 float 类型值
c.max_load_factor() /* c 试图维护的平均桶大小,返回float值。c 会在需要时添加新的桶,
以使得 load_factor <= max_load_factor重组存储,使得
bucket_count > n 且 bucket_count > size/max_load_factor */
c.reserve(n) // 重组存储,使得 c 可以保存 n 个元素且不必 rehash