新标准的四中无序容器:unordered_map、unordered_set、unordered_multimap、unordered_multimap。曾用于有序容器的操作也能用于无序容器。
无序容器不使用比较运算符来组织元素,而是使用哈希函数和关键字类型的==运算符。
管理桶
无序容器在存储上组织为一组桶,使用哈希函数将元素映射到桶,这就表示相同的哈希值的元素将存放在相同的桶内,如果容器允许关键字重复,那相同的关键字的元素也放在相同的桶内。无序容器的性能依赖于哈希函数的质量和桶的数量。
无序容器对关键字的要求
默认情况下,无序容器使用关键字类型的==来比较元素,他们还使用一个hash<key_type>类型的对象来生成每个元素的哈希值。但是只是对标准库中定义的类型,包括string和智能指针。对自定义的类型做关键字的情况,需要自己做一种类似重载的操作。
//假设使用的是自定义的类Sale_data做关键字,
//我们需要提供替代==运算符和计算哈希值函数。
size_t hasher(const Sale_data &sd){
//该hash类型建立在string类型之上。
retrun hash<string>()(sd.isbn);
/*相当于:
hash<string> hasher;
return hasher(sd.isbn);
*/
}
bool eqOp(const Sale_data &lhs,const Sale_data &rhs){
return lhs.isbn() == rhs.isbn();
}
//使用以上函数来定义一个无序容器
//using为这种类型取了一个别名,using和typedef类似,但更强大
using SD_multiset = unordered_multiset<Sale_data,decltype(hasher)*,decltype(eqOp)*>
//参数表示桶的大小,哈希函数指针和
//相等性判断运算符指针(如果类中重定义了==,也可不用写)
SD_multiset bookstore(42,hasher,eqOp);