C++ Primer第五版笔记——无序容器

新标准的四中无序容器: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);
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值