当前位置: 首页 > 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),有点意思

相关文章:

  • 学习alpha,第2个alpha
  • Acrel-EIoT 能源物联网云平台在能耗监测系统中的创新设计
  • Pandas 的透视与逆透视
  • 雅思阅读--句子结构
  • 奇瑞依托汽车产业链,实现服务机器人万台下线
  • 【LeetCode Hot100 | 每日刷题】二叉树的层序遍历
  • 二叉树与堆排序(概念|遍历|实现)
  • [人机交互]理解用户
  • LightGBM算法原理及Python实现
  • 提示词工程:通向AGI时代的人机交互艺术
  • 从零实现基于Transformer的英译汉任务
  • 高并发PHP部署演进:从虚拟机到K8S的DevOps实践优化
  • 机器学习 day6 -线性回归练习
  • 【Part 2安卓原生360°VR播放器开发实战】第三节|实现VR视频播放与时间轴同步控制
  • CentOS虚拟机固定ip以及出现的问题
  • 引用第三方自定义组件——微信小程序学习笔记
  • 【机器学习-线性回归-6】机器学习中的维度:从特征工程到降维艺术
  • DOCX转PDF怎么操作最简单?快速将DOCX转换为专业PDF文档
  • 【计算机网络-应用层】HTTP服务器原理理解以及C++编写
  • (提升)媒体投稿技能
  • 百亿基金经理调仓路径曝光,张坤、陈皓、胡昕炜又有新动作
  • 台湾花莲县海域发生5.7级地震,震源深度15公里
  • AI世界的年轻人|横跨教育与产业,他说攻克前沿问题是研究者的使命
  • 伊朗公布新型弹道导弹,“萨德”系统无法拦截
  • 孙一凡的东欧狂想音乐会:一场穿越东欧的听觉绮梦
  • “五一”假期首日:国铁南宁局发送旅客81.7万人次