当前位置: 首页 > 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.dtcms.com/a/173765.html

相关文章:

  • 学习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++编写
  • (提升)媒体投稿技能
  • 电商双11美妆数据分析
  • Qt/C++面试【速通笔记七】—Qt中为什么new QWidget不需要手动调用delete?
  • IdeaVim配置指南
  • 嵌入式openharmony标准鸿蒙系统驱动开发基本原理与流程
  • 【东枫科技】代理英伟达产品:DPU
  • 【Python pass 语句】
  • FPGA----基于ZYNQ 7020实现petalinux并运行一个程序
  • 2025年OpenAI重大架构调整:资本与使命的再平衡
  • FPGA----基于ZYNQ 7020实现petalinux文件持久化存储
  • SpringCloud入门教程合集(1)-SpringCloud简介与Eureka+Feign实现服务注册中心、服务提供与服务消费