unordered_set和set的第⼀个差异是对key的要求不同,set要求Key⽀持⼩于⽐较,⽽ unordered_set要求Key⽀持转成整形且⽀持等于⽐较,要理解unordered_set的这个两点要求得后续我们结合哈希表底层实现才能真正理解,也就是说这本质是哈希表的要求。 unordered_set和set的第⼆个差异是迭代器的差异,set的it...
还有unordered_map/set里面的insert我们也改一下 然后我们给unordered_map封装一个[]: 再来测试: 就可以了。 8. 补充完善:find、erase unordered_set和unordered_map的find和erase我们也搞一下吧,其实就是套一层壳嘛: 9. 存储自定义类型元素 如果我们现在想让unordered_map里面的key为日期类 代码语言:javascript ...
对set和unordered_set的insert性能进行比较(在release下跑) 在100w个数据下有大量重复值(随机数最多可以产生32768个),可以看到unordered_set的insert相比于set还是占有很大优势的 image-20230417110228383 在100w个数据下相比前一个实验较少重复值的随机数下(这次的随机数量有60多w),unordered_set的insert相比于set都差...
STL关联式容器中: set和map的底层数据结构为红黑树,因为map和set要求是自动排序的,红黑树能够实现这一功能,并且各个操作的时间复杂度都较低,而unordered_set和unordered_map的底层数据结构为哈希表,查找时间复杂度为常数级。 只要是前缀带了unordered的就是无序,后缀带了multi的就是允许键值重复,插入采用 insert_equa...
6.1 unordered_set 6.2 unordered_map 1. 模板参数控制 我们知道,unordered_set和unordered_map与set和map是一样的,前者不是真正的键值对,它的value值和key值相同;后者是真正的键值对。STL非常注重代码的复用,它们在底层使用了同一棵红黑树模板实现,这也是此文要用同一个哈希表实现unordered_set和unordered_map的原...
明确unordered_map是KV结构,unordered_set是K模型的结构。 获取key后可以做很多事情,比如查找和算出桶号 封装前哈希结点的类型是pair<K,V>,现在的类型是T。 pair<K,V>kv , 可以通过kv.first来获取key。 默认int、double、string等类型的key就是本身。(也可以自定义) ...
由于unordered_set是K模型,而unordered_map是KV模型,为了让底层的哈希桶能够同时支持两种不同的模型,所以这里需要对哈希节点进行改造,改造后的结果如下: //改造后template<class T>//将模板参数变成T,对于K模型来说,传入的类型就是<Key,Key>键值对,对于KV模型来说,传入的就是<Key,Value>键值对struct HashNode{...
二、unordered_set模拟实现代码 三、unordered_map模拟实现代码 一、改造哈希表 使用的代码是之前篇章哈希表的代码,改造后哈希表代码如下: #pragma once#include <vector>#include <string>//开散列(哈希桶)template<classT>structHashNode{T_data;HashNode<T>*_next;HashNode(constT&data):_data(data),_next(nul...
unordered_set 适用于需要去重的场景 unordered_map 适用于需要统计重复次数的场景,或者需要 记录额外信息,如位置等 数组适用于简单场景 1.用数组实现哈希表 242. 有效的字母异位词easy 用数组作为哈希表来解决哈希问题 classSolution{public:boolisAnagram(strings,stringt){intarr[26]={0};for(inti=0;i<s.size...
本文主要使用unordered_set与unordered_map。 哈希表 unordered_set的使用: //1. 创建哈希集合 unordered_set<int> s; //2. 插入元素 s.insert(1); s.insert(5); s.insert(4); s.insert(9);//注意: unordered_set无自动排序功能!!! //3. 统计元素个数 ...