头文件:<unordered_set>
、<unordered_map>
Unordered容器的能力
所有标准化无序容器类都以哈希表为基础.
关于再散列,有两种实现策略:
1.传统做法:在单一insert或erase动作出现时,有时候会发生一次内部数据重新组织
2.递进式做法是:渐进改变bucket或slot数量
对于每个将被存放的元素,哈希函数会把key映射至哈希表内的某个bucket中.每个bucket管理一个单向linked list.
创建和控制Unordered容器
构造函数和析构函数
布局操作
提供你自己的Hash函数
template <typename T>
class Hash
{
};
template <>
class Hash<std::string>//string的显式具体化
{
public:
size_t operator()(const std::string & key)
{
size_t hashval = 0;
for (char ch : key)
hashval = 37 * hashval + ch;
return hashval;
}
};
template<>
class Hash<int>//int的显式具体化
{
public:
size_t operator()(int item)//除留余数法
{
size_t i = item;
return i;
}
};
unordered_set<int,Hash<int>>custset;
如果不愿意传递一个function obejct成为容器类型的一部分,也可以传递一个hash函数作为构造函数实参:
size_t customer_hash_func(const Customer& c)
{
return...
}
unordered_set<Customer, size_t(*)(const Customer&)>custset(20,customer_hash_func);