无序关联容器使用哈希函数和关键字类型的==运算符组织元素。
使用无序容器
#include<iostream>
#include<unordered_map>
using namespace std;
int main()
{
unordered_map<string, int> words;
string word;
while (cin>>word)
{
if (!words.insert(pair<string,int>( word,1)).second )
{
++words[word];
}
}
for (auto i : words)
cout << i.first << " " << i.second << endl;
return 0;
}
使用的方法也和正常的map是一致的。
但是需要注意的是:提供和有序容器相同的操作(find、insert等),输出可能不同(不按字典序排序,按哈希函数排序 ),有序和无序通常可以互相替换。
管理桶
无序容器在存储上组织为一组桶,每个桶保存0~多个元素。无序容器使用一个哈希函数将元素映射到桶。每个桶保存一个特定哈希值,如果允许重复关键字,则具有相同关键字的元素也在一个桶中。
无序容器性能依赖于哈希函数的质量和桶的数量和大小。
哈希函数能将特定的值映射到唯一的桶。也可以将不同关键字的元素映射到相同的桶。当一个桶保存多个元素时,采用顺序搜索插入元素。(即桶外无序,桶内顺序)
//桶接口
c.bucket_count() //正使用桶数目
c.max_bucket_count() //容器对桶数目的容量
c.bucket_size(n) //第n个桶元素数
c.bucket(k) //关键字k在哪个桶中
//桶迭代
local_iterator //访问桶中元素的迭代器类型
const_local_iterator //const版本
c.begin(n),c.end(n)
c.cbegin(n),c.cend(n)
//哈希策略
c.load_factor() //每个桶平均数量,返回float值
c.max_load_factor() //c维护平均桶大小,返回float值。c会在需要的时候添加新桶,使得c.load_factor<=c.max_load_factor.
c.rehash(n) //重组存储,bucket_count>=n&&bucket_count*max_load_factor>size
c.reserve(n) //重组存储,c可以保存n个元素且不rehash
无序容器使用关键字类型的==运算符比较元素,通过hash<key_type>类型的对象来生成每个元素的哈希值。标准库为内置类型替供了hash模板。