C++哈希表怎么封装出unordered_set和unordered_map


这篇文章主要介绍了C++哈希表怎么封装出unordered_set和unordered_map的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C++哈希表怎么封装出unordered_set和unordered_map文章都会有所收获,下面我们一起来看看吧。封装时想直接搭出unordered_set/unordered_map的结构,发现行不通于是从哈希表的结构入手,先把一些类型改成泛型结点的KV结构改成T ,改变结点的类型后HashTable里的结点类型也需要更改typedef HashNode的模板也需要改为typedef HashNode Node;明确unordered_map是KV结构,unordered_set是K模型的结构。获取key后可以做很多事情,比如查找和算出桶号封装前哈希结点的类型是pair,现在的类型是T。pairkv , 可以通过kv.first来获取key。默认int、double、string等类型的key就是本身。(也可以自定义)类型T既可能是pair也可能是一个int类型等等,那应该怎么得到类型T的key?借助模板+仿函数。以unordered_map为例unordered_map类中实现仿函数哈希表中增加一个模板参数KeyOfT来获取T类型的Key同理unordered_set里仿函数的实现之后把所有与.first有关的都用模板实例化的kot来获取key去掉哈希表模板参数里哈希函数的默认值 在unordered_set/unordered_map加上第三个模板参数Hash自定义哈希规则封装前的哈希表现在的哈希表解释:实例化对象时便可以传入模板参数达到自自定义哈希规则的效果。看完上面的对这四个参数应该有大概的了解了。这里一齐解释一下为什么这么写。第一个参数K:key的类型就是K。查找函数是根据key来查找的,所以需要K。第二个参数T:哈希表结点存储的数据类型。比如int,double,pair,string等。第三个参数KeyOfT:拿到T类型(结点数据类型)的key。第四个参数Hash:表示使用的哈希函数HashFunc(kot(T)) 取出这个类型的key的映射值unordered_set/unordered_map的迭代器是单向迭代器迭代器只能++,不能 –Self表示自己前置++实现思路:如果当前结点的下一个不为空 直接访问即可如果下一个结点为空,就得找下一个桶 怎么找?根据当前指向的数据算出桶号,再把桶号+1,一直往后面找,直到找到一个桶不为空,或者找完了整个容器都没找到,就返回空构造函数得到结点所在的哈希表重载除了++以外的一些运算符T为pair时可以通过it->first拿到key。你会发现这样一个现象,迭代器里面用了哈希表,哈希表里用了迭代器,也即两个类互相引用如果迭代器写在哈希表前面,那么编译时编译器就会发现哈希表是无定义的(编译器只会往前/上找标识符)。如果哈希表写在迭代器前面,那么编译时编译器就会发现迭代器是无定义的。为了解决这个问题,得用一个前置声明解决,即在迭代器和哈希表的定义前加一个类的声明。迭代器里借助一个指针访问了哈希表的数据。但是哈希表的数据被private修饰,所以在类外不能访问,用友元解决。在哈希表里面声明迭代器友元类(表示迭代器是哈希表的朋友,可以访问哈希表所有的数据)const pair!=const pair写代码时的一个bug相关的例子解释:调试看了一下地址,传进仿函数的时候参数用的引用接收,但是因为类型不同,所以仿函数参数接收时进行了一次拷贝才拿到了sort和排序两个字符串,但也因此那个参数成临时变量了,所以返回了一块被销毁的空间的引用 为什么变成空串?因为string析构后那块空间免费云主机域名成空串了简单来说 仿函数没有拿到真实的那块空间 而是拷贝后形参的空间不能识别迭代器是类型还是成员导致模板报错,加上typename解决。typedef typename HashBucket::HashTable::iterator iterator;typename是告诉编译器这是一个类型 等这个类实例化了再去找里面的东西关于“C++哈希表怎么封装出unordered_set和unordered_map”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“C++哈希表怎么封装出unordered_set和unordered_map”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注百云主机行业资讯频道。

相关推荐: css怎么设置字体旋转角度

这篇文章主要讲解了“css怎么设置字体旋转角度”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“css怎么设置字体旋转角度”吧!1.首先,在页面中创建两个p标签,并添加文字用于对比;测试文本测试文本2.p标签创建好…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 03/12 10:08
下一篇 03/12 10:08

相关推荐