无序容器有4个:unordered_map、unordered_set、unordered_multimap、unordered_multiset
无序容器是 元素不按排序方式存储 的容器,无序容器使用哈希存储方式组织元素:按照对关键字使用哈希函数得到的值分配元素的地址。
在维护元素的序代价非常高时,应使用无序容器。
无序容器可以使用关联容器的一切操作,如:使用迭代器遍历元素,但得到的结果与有序元素不一样。
无序容器在存储上组织为一组桶,每个桶保存零个或多个元素。无序容器通过哈希函数得到一个哈希值,依据哈希值将元素映射到桶,不同的哈希值对应不同的桶,但不同的元素关键字经过哈希函数可能得到同一哈希值。这意味着无序容器的一个桶中会有0到多个元素。
由关键字通过哈希函数映射到哈希值的效率通常较高,因此在无序容器中查找某元素的效率,主要由在同一桶中查找元素的效率决定。在理想状态下,我们希望每个关键字只映射到同一个桶。
为了提高桶的效率,标准库提供了管理桶的一系列操作:
桶接口:
c.bucket_count() | 正在使用桶的数量。 |
c.max_bucket_count() | 容器能容纳的最多的桶的数量 |
c.bucket_size(n) | 第n个桶中有多少元素 |
c.bucket(k) | 关键字为k的元素在哪个桶中 |
local_iterator | 桶中元素的迭代器类型 |
const_local_iterator | 桶迭代器的const版本 |
begin()、end() | 桶n的首元素迭代器和尾后迭代器 |
cbegin()、cend() | const版本的首元素和尾后迭代器 |
c.load_factor() | 每个桶的平均元素数量,返回float值 |
c.max_load_factor() | 桶平均元素阈值,容器试图维护的桶平均元素数量,当load_factor()的值超过max_load_factor()时,容器将调整桶的大小。 |
c.rehash(n) | 重组存储,使桶个数大于n且bucket_count > size/max_load_factor(使桶平均元素个数维持在max_load_factor以下) |
c.reserve(n) | 重组存储,使c可以保存n个元素而不必rehash |