当前位置: 首页 > news >正文

unordered_map和unordered_set的设计

#pragma once
#include"HashTable.h"
namespace aqc
{template<class K,class V,class Hash=HashFunc<K>>class unordered_map{public:struct MapKeyOfT{const K& operator()(const pair<K, V>& kv)//pair对象是const返回值也得是const{return kv.first;}};typedef typename HashBucket::HashTable<K, pair<const K, V>, MapKeyOfT, Hash>::iterator iterator;typedef typename HashBucket::HashTable<K, pair<const K, V>, MapKeyOfT, Hash>::const_iterator const_iterator;iterator begin(){return _ht.begin();//普通set调用,返回的是普通哈希迭代器,接收的是const哈希迭代器,要加一个构造函数}iterator end(){return _ht.end();}const_iterator begin()const{return  _ht.begin();//const set调用,返回const 哈希迭代器}const_iterator end()const{return _ht.end();}iterator find(const K& key){return _ht.Find(key);}bool erase(const K& key){return _ht.Erase(key);}pair<iterator, bool> insert(const pair<K,V>& kv){return _ht.Insert(kv);}V& operator[](const K& key){pair<iterator,bool> ret=insert(make_pair(key,V()));return ret.first->second;}private:HashBucket::HashTable<K, pair<const K, V>, MapKeyOfT, Hash> _ht;};
}

1.unordered_map的模板参数,键类型K,值类型V,把K变成size_t的仿函数类类型Hash,

2.unordered_map封装的是哈希表对象,并且封装的是链地址法开散列实现的哈希表,所以模板参数参数,第一个键类型,第二个节点数据类型,剩下两个不说了

3.接口就封装一下就是了,值得一说的就是operator[ ],底层是用insert去插入<key, V()>的键值对,然后无论插入成功还是失败,返回迭代器对应节点的数据的值V的引用

#pragma once
#include"HashTable.h"namespace aqc
{template<class K, class Hash = HashFunc<K>>//HashFUnc展开在全局域中class unordered_set{struct SetKeyOfT{size_t operator()(const K& key){return key;}};public:typedef typename HashBucket::HashTable<K, K, SetKeyOfT, Hash>::const_iterator iterator;//set节点的_data是K不允许被修改的,用const_iterator包装,返回的const K&和const K*使其值不会被修改typedef typename HashBucket::HashTable<K, K, SetKeyOfT, Hash>::const_iterator const_iterator;iterator begin(){return _ht.begin();//普通set调用,返回的是普通哈希迭代器,接收的是const哈希迭代器,要加一个构造函数}iterator end(){return _ht.end();}const_iterator begin()const{return  _ht.begin();//const set调用,返回const 哈希迭代器}const_iterator end()const{return _ht.end();}iterator find(const K& key){return _ht.Find(key);}bool erase(const K& key){return _ht.Erase(key);}pair<iterator, bool> insert(const K& key){return _ht.Insert(key);}private:HashBucket::HashTable<K, K, SetKeyOfT, Hash> _ht;};
}

1.unordered_set的模板参数,键类型K,这同时也是节点数据类型,把K变成size_t的仿函数类类型Hash

2.unordered_set封装的是哈希表对象,并且封装的是链地址法开散列实现的哈希表,所以模板参数参数,第一个键类型,第二个节点数据类型,剩下两个不说了

封装下的insert接口

在哈希表层用的是insert(T),也就是参数是节点的数据类型,在map层封装的就是insert(pair<K,V>),

在set层insert(K),有点意思

http://www.xdnf.cn/news/300385.html

相关文章:

  • OpenGl实战笔记(3)基于qt5.15.2+mingw64+opengl实现光照变化效果
  • 高性能网络优化:深入解析忙轮询(Busy Polling)技术
  • 如何把阿里云a账号下面的oss迁移到阿里云b账号下面(同区域)
  • Nginx 安全防护与 HTTPS 部署
  • UE5 把翅膀动画额外创建动画蓝图并和角色绑定混合动画
  • Kali:利用rockyou文本字典hash破解zip压缩包密码
  • MySQL + Qwen3-0.5B + Flask + Dify 工作流部署指南
  • 探秘数据中台:五大核心平台的功能全景解析
  • QuecPython+Aws:快速连接亚马逊 IoT 平台
  • 从试错到智能决策:Python与强化学习优化自动驾驶策略
  • Netty 的 Reactor 模型
  • deeplabv3+街景图片语义分割,无需训练模型,看不懂也没有影响,直接使用,cityscapes数据集_23
  • 掌握 Git 常用命令,高效管理项目版本
  • java安全入门
  • Kotlin空安全解决Android NPE问题
  • 第八章--图
  • LeetCode 3423. 循环数组中相邻元素的最大差值 题解
  • homebrew安装配置Python(MAC版)
  • Oracle01-入门
  • 个人Unity自用面经(未完)
  • 神经网络中之多类别分类:从基础到高级应用
  • ChatGPT对话导出工具-轻松提取聊天记录导出至本地[特殊字符]安装指南
  • 审计数据整合:集团多主体科目余额表合并全流程解析
  • JVM内存模型深度解剖:分代策略、元空间与GC调优实战
  • 在 Laravel 12 中实现 WebSocket 通信
  • pyqt写一个TCP(UDP)检测工具
  • 【Python】一键提取视频音频并生成MP3的完整指南 by `MoviePy`
  • 基于Jetson Nano与PyTorch的无人机实时目标跟踪系统搭建指南
  • 20250506异形拼图块(圆形、三角、正方,椭圆/半圆)的中2班幼儿偏好性测试(HTML)
  • 【ArcGISPro】属性规则--属性联动