前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >哈希封装unordered_map和unordered_set

哈希封装unordered_map和unordered_set

作者头像
小灵蛇
发布2024-06-06 21:34:25
810
发布2024-06-06 21:34:25
举报
文章被收录于专栏:文章部文章部

一. 哈希表的改造

咱们这里还是跟Map和Set的封装一样的道理,没有必要为了unordered_map和unordered_set传的参数不同就实例化两份代码,可以直接通过模板参数来解决。那么unordered_map传的是pair<key,value>,unordered_set传的是key。对于哈希表还有不懂的可以去看上一篇博客(http://t.csdnimg.cn/O5Vg5),对Map和Set封装还有不懂的可以去看博客(http://t.csdnimg.cn/dOSOt)。

所以咱们的代码改造成:

到此时我们还没有出现新的东西,一切都是在《Map和Set的封装》和《哈希开散列的实现》两个基础上结合起来的。而对迭代器的封装也是如此。

二. 迭代器的封装

我们还是采用之前的模板参数来实现,需要注意的是,由于迭代器里面要用到自定义类HashTable,而由于HashTable 我把他排版在了迭代器的下面,所以我们要先在迭代器的前面申明这个类存在,因为编译器只会向上兼容,这也是一个可以借鉴的点。而我们自定义类HashTable里面也要用到迭代器,那么反过来迭代器在类的上方,可以向上兼容,所以不用在类的前面申明了。

特别注意的是:

  1. 如果你把迭代器定义在了类HashTable的下面,就无需在迭代器的上面进行声明,而要在类HashTable的上面声明迭代器的存在。
  2. 此处迭代器要对类HashTable里面的私有成员进行访问,所以要在类HashTable里面对迭代器设置友元,使迭代器能访问私有成员。

那么类HashTable中设置友元具体是:

此处迭代器里面值得一讲的是++操作(因为哈希表开散列的结构是单链表,所以没有必要实现--操作),我们得分情况来看,如果这个元素之后在用一个桶中还有元素,那么直接++就行;如果没有,则要依次向后找,找到下一个不为空的桶开始遍历。

三. 哈希表整体代码

那么我们哈希表的整体代码就是:

注意:由于迭代器的构造要用到HashTable,所以在HashTable类中插入操作的时候,用this返回哈希表。

四. unordered_set和unordered_map具体实现

3.1 unordered_set具体实现

那么到此时,unordered_set的具体实现已经很清楚了。这里我们要知道unordered_set里面的元素key是不能被改变的,所以为其附上const的枷锁。

3.2 unordered_map具体实现

同样,unordered_map的具体实现已经很清楚了。这里我们要知道unordered_map的pair<key,value>里的key是不能被改变的,所以也要为其附上const的枷锁。

总结

好了,到这里今天的知识就讲完了,大家有错误一点要在评论指出,我怕我一人搁这瞎bb,没人告诉我错误就寄了。

祝大家越来越好,不用关注我(疯狂暗示)

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-06-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一. 哈希表的改造
  • 二. 迭代器的封装
  • 三. 哈希表整体代码
  • 四. unordered_set和unordered_map具体实现
    • 3.1 unordered_set具体实现
      • 3.2 unordered_map具体实现
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档