C++ unordered_map和unordered_set的使用
1.unordered_set系列的使用
1.1unordered_set和unordered_multiset参考文档
unordered_set和unordered_multiset参考文档
1.2unordered_set类的介绍
• unordered_set的声明如下,Key就是unordered_set底层关键字的类型
• unordered_set默认要求Key⽀持转换为整形,如果不⽀持或者想按⾃⼰的需求⾛可以⾃⾏实现⽀ 持将Key转成整形的仿函数传给第⼆个模板参数
• unordered_set默认要求Key⽀持⽐较相等,如果不⽀持或者想按⾃⼰的需求⾛可以⾃⾏实现⽀持 将Key⽐较相等的仿函数传给第三个模板参数
• unordered_set底层存储数据的内存是从空间配置器申请的,如果需要可以⾃⼰实现内存池,传给 第四个参数
• ⼀般情况下,我们都不需要传后三个模板参数
• unordered_set底层是⽤哈希桶实现,增删查平均效率是O(1) ,迭代器遍历不再有序,为了跟set 区分,所以取名unordered_set
• 前⾯部分我们已经学习了set容器的使⽤,set和unordered_set的功能⾼度相似,只是底层结构不 同,有⼀些性能和使⽤的差异,这⾥我们只讲他们的差异部分
1.3unordered_set和set的使用差异
• 查看⽂档我们会发现unordered_set的⽀持增删查且跟set的使⽤⼀模⼀样,关于使⽤我们这⾥就不 再赘述和演⽰了
• unordered_set和set的第⼀个差异是对key的要求不同,set要求Key⽀持⼩于⽐较,
⽽ unordered_set要求Key⽀持转成整形且⽀持等于⽐较,要理解unordered_set的这个两点要求得 后续我们结合哈希表底层实现才能真正理解,也就是说这本质是哈希表的要求
• unordered_set和set的第⼆个差异是迭代器的差异,set的iterator是双向迭代器,unordered_set 是单向迭代器,其次set底层是红⿊树,红⿊树是⼆叉搜索树,⾛中序遍历是有序的,所以set迭代 器遍历是有序+去重。⽽unordered_set底层是哈希表,迭代器遍历是⽆序+去重
• unordered_set和set的第三个差异是性能的差异,整体⽽⾔⼤多数场景下,unordered_set的增删 查改更快⼀些,因为红⿊树增删查改效率是O(logN) ,⽽哈希表增删查平均效率是O(1) ,具体 可以参看下⾯代码的演⽰的对⽐差异。
1.4unordered_map和map的使用差异
• 查看⽂档我们会发现unordered_map的⽀持增删查改且跟map的使⽤⼀模⼀样,关于使⽤我们这 ⾥就不再赘述和演⽰了
• unordered_map和map的第⼀个差异是对key的要求不同,map要求Key⽀持⼩于⽐较,
⽽ unordered_map要求Key⽀持转成整形且⽀持等于⽐较,要理解unordered_map的这个两点要求 得后续我们结合哈希表底层实现才能真正理解,也就是说这本质是哈希表的要求
• unordered_map和map的第⼆个差异是迭代器的差异,map的iterator是双向迭代器, unordered_map是单向迭代器,其次map底层是红⿊树,红⿊树是⼆叉搜索树,⾛中序遍历是有 序的,所以map迭代器遍历是Key有序+去重。⽽unordered_map底层是哈希表,迭代器遍历是 Key⽆序+去重
• unordered_map和map的第三个差异是性能的差异,整体⽽⾔⼤多数场景下,unordered_map的 增删查改更快⼀些,因为红⿊树增删查改效率是O(lohN) ,⽽哈希表增删查平均效率是O(1), 具体可以参看下⾯代码的演⽰的对⽐差异
1.5unordered_multimap/unordered_multiset
• unordered_multimap/unordered_multiset跟multimap/multiset功能完全类似,⽀持Key冗余
• unordered_multimap/unordered_multiset跟multimap/multiset的差异也是三个⽅⾯的差异, key的要求的差异,iterator及遍历顺序的差异,性能的差异
1.6unordered_xxx的哈希相关接口
Buckets和Hashpolicy系列的接⼝分别是跟哈希桶和负载因⼦相关的接⼝,⽇常使⽤的⻆度我们不需 要太关注,后⾯学习了哈希表底层,我们再来看这个系列的接⼝,⼀⽬了然。
原文地址:https://blog.csdn.net/2401_83575662/article/details/144384088
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!