【数据结构】哈希桶封装出map和set

利用之前的哈希桶封装出unordered_map和unordered_set。

这个封装并不简单,迭代器的使用,模板参数的繁多,需要我们一层一层封装。

map是一个k - v类型,set是k类型,那么就明确了如果需要封装,底层的tables必须能接收 K-T类型。在上层,就能用<K,pair<K,V>>封装map ,利用<K,K>封装set


修改结构K-V=> T

1.底层不关心是K还是pair<> ,利用T代替。

2.哈希桶的参数修改为T

为什么需要单独传入一个K的key?

为了方便 erase和find,通过第一个参数就能统一操作

3.关于仿函数

map的插入,会是一个键值对,set是一个单词。它们的上层是不一样的。

因此这里借用仿函数获取map和set的key

map和set都会接收T,map返回pair的第一个元素,set直接返回key

故底层的哈希桶需要传入仿函数


使用insert的实现就是附用哈希桶的insert

我们不关心是pair还是key都是统一被处理。

注意在哈希桶中的inset还有find,我们调用不了kv.first,我们要利用仿函数kot获取key。


底层迭代器

需要给迭代器传入哈希桶,它的参数应该有K,T,KeyOfT,Hash函数。

因为在迭代器必定有引用和指针,故参数多增加为K,T,,T*,T&,KeyOfT,Hash

关于在哈希桶中调用迭代器,在迭代器中需要哈希桶的参数。

故需要前置声明


迭代器的参数:

结点、哈希桶的指针,hashi(当前在哪一个桶上)

迭代器++

寻找一个不为空的桶,往下遍历链表,如果当前桶结束,则继续寻找下一个不为空的桶遍历,直到找到结尾。

返回值是自身的迭代器,返回this即可。


基本操作!= * ->

构造(普通迭代器和常迭代器)

为了保证迭代器不能被修改,需要再实现一份const迭代器

const迭代器的实现是附用普通。


在哈希桶中使用迭代器

begin()

需要返回一个迭代器类型

_tables[i] this, i 的返回值就能传入结点,哈希表,hashi


哈希桶的end()

返回空结点 当前表,-1

封装map

begin和end 调用底层哈希桶的迭代器


修改insert的返回值为pair

底层修改

哈希桶的insert第一个参数迭代器类型,利用新插入的node构造


operator[ ]

返回值为 键值对的 V

调用insert插入

pair的second是bool类型,bool代表在不在,若插入成功返回true,插入失败返回false,但是会返回之前已经存在并且相同类型的迭代器


封装set

set的封装要点是inser插入

要针对key不可修改,返回的是const迭代器。

利用auto自动推演出ret,再用ret构造出const迭代器(权限缩小)和bool

最后构造pair

相关推荐
Blockbuater_drug10 小时前
InChIKey: 分子的“化学身份证”,从哈希原理到全球监管合规(2025)
算法·哈希算法·inchikey·rdkit·分子表达·化学信息学
报错小能手17 小时前
数据结构 可扩展哈希
数据结构·哈希算法·散列表
wbs_scy17 小时前
C++:unordered_map/unordered_set 使用指南(差异、性能与场景选择)
开发语言·c++·哈希算法
C雨后彩虹20 小时前
ConcurrentHashMap 扩容机制:高并发下的安全扩容实现
java·数据结构·哈希算法·集合·hashmap
这我可不懂20 小时前
谈谈mcp协议的实现
开发语言·qt·哈希算法
C雨后彩虹21 小时前
ConcurrentHashMap 源码逐行拆解:put/get 方法的并发安全执行流程
java·算法·哈希算法·集合·hashmap
C雨后彩虹2 天前
ConcurrentHashMap 核心锁机制:CAS+Synchronized 的协同工作原理
java·数据结构·哈希算法·集合·hashmap
C雨后彩虹2 天前
HashMap的线程安全问题:原因分析与解决方案
java·数据结构·哈希算法·集合·hashmap
foo1st2 天前
HTML中常用HASH算法使用笔记
javascript·html·哈希算法
月明长歌2 天前
【码道初阶】Leetcode771 宝石与石头:Set 判成员 vs List 判成员(同题两种写法的差距)
java·数据结构·leetcode·list·哈希算法·散列表