数据结构: unordered_map与unordered_set
目录
1.框架
2.结构
unordered_map
unordered_set
3.对HashTable的修改
更改模板参数
4.增加迭代器
a.结构
b.运算符重载
c.HashTable封装迭代器
d.unordered_map与unordered_set的迭代器
1.框架
1.复用HashTable ~~> 增加模板参数KeyOfT 来获取 Key值
unordered_map传K,V unordered_set传K
2.增加迭代器: HashNode + HashTable ~~> ++,[ ]的实现, 普通迭代器构造const迭代器
3.若是要处理自定义类型转换为整型, 在外面写仿函数传给unordered_map或unordered_set
2.结构
unordered_map
template<class K,class V,class Hash = HashFunc<V>>class unordered_map {struct MapKeyOfT{const K& operator()(const pair<K, V>& kv){return kv.first;}};public:bool insert(const pair<const K, V>& kv) {return _ht.Insert(kv);}private:HashBucket::HashTable<K, pair<const K, V>, MapKeyOfT,Hash> _ht;};
unordered_set
template<class K,class Hash = HashFunc<K>>class unordered_Set {public://仿函数struct SetKeyOfT{const K& operator()(const K& k) {return k;}};//接口: insert + erase + findbool insert(const K& key) {return _ht.Insert(key);}private:HashBucket::HashTable<K, K, SetKeyOfT,Hash> _ht;};
3.对HashTable的修改
更改模板参数
1.增加KeyOfT仿函数-->让unordered_map与unordered_set同时复用HashTable
2.增加模板参数K-->区别unordered_map (K,V) 与 unordered_set(K)
~~>所有涉及到取data值的都改为 , 使用仿函数KeyOfT去取 (插入 + 查找 + 删除)

4.增加迭代器
a.结构
//2.迭代器//重载 : * -> ++ == != template<class K,class T,class KeyOfT,class Hash>struct __HashIterator {typedef HashNode<T> Node;typedef HashTable< K, T, KeyOfT, Hash> HT;typedef __HashIterator< K, T, KeyOfT, Hash> Self;//节点 + 哈希表Node* _node;const HT* _ht;//构造函数__HashIterator(Node* node, const HT* ht) :_node(node),_ht(ht){}//重载运算符};
b.运算符重载
* -> == !=
//重载运算符T& operator*() { return _node->_data; }T* operator->() { return &(_node->_data); }bool operator==(const Self& it) { return _node == it._node; }bool operator!=(const Self& it) { return _node != it._node; }
++
思路:1.如果下一个节点不为nullptr,返回下一个节点
2.如果下一个节点为nullptr,找下一个桶
--先根据节点里面的data,获取key值,来算当前桶的位置
--找下一个不为空的桶
如果这个桶不为空, 把节点给它
如果这个桶为空,++hashi
算当前桶的位置: 获取key + 将非整型数据转换为整型 + 获取哈希桶的个数 + 哈希表
~~>仿函数 + HashTable提供接口获取 或者 友元
Self& operator++() {//1.如果下一个节点不为nullptr返回下一个节点if (_node->_next) {_node = _node->_next;}//2.找下一个不为空的桶else {//计算当前桶的位置Hash hash; KeyOfT kot;size_t hashi = hash(kot(_node->_data)) % _ht->GetCapacity();vector<Node*> tables = _ht->GetTables();++hashi;//找到不为空的桶while (hashi < _ht->GetCapacity()) {if (tables[hashi]){_node = tables[hashi];break;}else{++hashi;}}//找完没有下一个节点就返回空指针if (hashi == _ht->GetCapacity()) _node = nullptr;}return *this;}};效果:
c.HashTable封装迭代器
begin
思路:
1.找到第一个有元素的桶
iterator begin() {//找第一个有元素的哈希桶size_t hashi = 0;while (hashi < GetCapacity()) {if (_tables[hashi] != nullptr) {return iterator(_tables[hashi], this);}++hashi;}return iterator(nullptr,this);}
end
iterator end() {return iterator(nullptr,this);}
d.unordered_map与unordered_set的迭代器
unordered_map与unordered_set的迭代器~~>调用HashTable的迭代器
unordered_map~~> K,V类型允许V被修改~~>const迭代器与普通迭代器
unordered_set~~> K类型不允许被修改 ~~>const迭代器与普通迭代器都是const迭代器
增加const迭代器与普通迭代器~~> 修改迭代器的模板参数 + 修改HashTable的传参
迭代器的模板参数修改

HashTable传参的修改

unordered_map

unordered_set

提供普通迭代器构造const迭代器
普通对象调用begin函数,返回普通迭代器,但是定义的普通迭代器是const迭代器,会发生隐式类型转换~~>因此需要提供普通迭代器构造const迭代器

[]的实现: a.insert返回类型改为pair<iterator,bool>
1.调用insert函数~~>若没有这个K值就将其插入到哈希表中
2.返回V

效果:

相关文章:
数据结构: unordered_map与unordered_set
目录 1.框架 2.结构 unordered_map unordered_set 3.对HashTable的修改 更改模板参数 4.增加迭代器 a.结构 b.运算符重载 c.HashTable封装迭代器 d.unordered_map与unordered_set的迭代器 1.框架 1.复用HashTable ~~> 增加模板参数KeyOfT 来获取 Key值 unorder…...
WebDAV之π-Disk派盘 + PassStore
大家常用的qq,手机微信,新浪微博等。假如各个网址都设成同样的帐号和登陆密码,一旦某一帐户泄漏了,别的平台上的账户密码都有被撞库攻击的风险。在不一样的站点设定不一样的高韧性登陆密码才算是最安全可靠的确保,殊不知这般繁多的帐户密码是难以记得的。因而,有着一款安…...
OpenCV实现手势虚拟拖拽
前言: Hello大家好,我是Dream。 今天来学习一下如何使用OpenCV实现手势虚拟拖拽,欢迎大家一起前来探讨学习~ 一、主要步骤及库的功能介绍 1.主要步骤 要实现本次实验,主要步骤如下: 导入OpenCV库。通过OpenCV读取摄…...
深圳市宝安区委常委、宣传部部长周学良一行莅临联诚发考察调研
11月9日,深圳市宝安区组织开展主题教育“大走访、大座谈、大起底”行动和调查研究、“基层调研服务日”活动。当日上午,区委常委、宣传部部长周学良率调研组莅临联诚发LCF总部考察调研。区委宣传部副部长孙箫韵,区文化广电旅游体育局党组成员…...
Presentation Prompter 5.4.2(mac屏幕提词器)
Presentation Prompter是一款演讲辅助屏幕提词器软件,旨在帮助演讲者在公共演讲、主持活动或录制视频时更加流畅地进行演讲。以下是Presentation Prompter的一些特色功能: 提供滚动或分页显示:可以将演讲稿以滚动或分页的形式显示在屏幕上&a…...
9 网关的作用
1、总结: 1.如果离开本局域网,就需要经过网关,网关是路由器的一个网口。 2.路由器是一个三层设备,里面有如何寻找下一跳的规则 3.经过路由器之后 MAC 头要变,如果 IP 不变,相当于不换护照的欧洲旅游&#…...
计算机网络实验
计算机网络实验 使用软件PT7.0按照上面的拓扑结构建立网络,进行合理配置,使得所有计算机之间能够互相通信。并且修改各交换机的系统名称为:学号_编号,如你的学号为123,交换机Switch0的编号为0,则系统名称为…...
九凌网络分享外贸快车实现迅速出口的目标
随着全球化进程的不断加速,外贸行业也越来越繁荣。但如何在这个竞争激烈的市场中迅速出口,成为了很多外贸企业家们面临的难题。为此,很多企业开始寻求新的帮助,其中一种办法就是通过专业的外贸快车来提高自己的出口速度。九凌网络…...
分享66个Python管理系统源代码总有一个是你想要的
分享66个Python管理系统源代码总有一个是你想要的 源码下载链接:https://pan.baidu.com/s/1FGmE9Q_NE1-cjjoxU540BQ?pwd8888 提取码:8888 项目名称 automobile-sales-management-system汽车销售管理系统 Python Vue BNUZ教务系统认证爬虫Python语言…...
python 删除特定字符所在行
嗨喽,大家好呀~这里是爱看美女的茜茜呐 查询文件中含有特殊字符串的行 #!/usr/bin/python # -*- coding:utf-8 -*- import re file1 open(test.txt,r) istxt re.compile(r.*if.*,re.I) for line in file1.readlines():line line.strip()ifstr re.findall(istxt…...
邮箱哪家强?哪个牌子邮箱好用
邮箱在国内外使用情况不太一样,国内一般都是工作中需要用邮箱,直接使用公司发的企业邮箱就可以了,个人一般自己需要使用邮箱频率比较少,大多是用来注册其他平台信息,接受验证码、电子发票等等,使用不频繁。…...
关于DDD的贫血模型和充血模型到底是什么区别?
贫血模型和充血模型是两种不同的设计模式,用于处理复杂的业务逻辑和数据操作。 贫血模型是指将业务逻辑和数据操作分离,业务逻辑在服务层处理,数据操作在数据访问层处理。这种设计模式的优点是易于维护和测试,但是在处理复杂的业…...
让BI自动生成零售数据分析报表?用模板
不知道BI零售数据分析怎么做?用模板。 没时间去整理数据、计算零售数据分析指标?用模板。 不知道怎么做出炫酷直观的零售数据分析报表?用模板。 …… 奥威BI零售数据分析模板全新上线,数据分析模型、数据可视图表、关键指标以…...
以吉祥物宣传片实力出圈!吉祥物三维动画宣传片怎么制作?
首届学青会吉祥物“壮壮”、“美美”在宣传片中展示了举重、打羽毛球、游泳等运动姿态,靠着可爱的虚拟形象萌出圈! *图片源于网络 在数字化时代,吉祥物三维动画宣传片已成为众多大型活动、品牌宣发、文旅城市宣传的一大途径,如学…...
TensorFlow(1):深度学习的介绍
1 深度学习与机器学习的区别 学习目标:知道深度学习与机器学习的区别 区别:深度学习没有特征提取 1.1 特征提取方面 机器学习的特征工程步骤是要靠手动完成的,而且需要大量领域专业知识深度学习通常由多个层组成,它们通常将更简…...
C# 如何优雅的写代码[进阶篇]
文章目录 前言相关文章如何让代码优雅知识点补充enum枚举类型?null判定 前言 我之前发布过一些篇章,是专门关于代码优化的,距离我上一次[如何优雅的写C#]已经过去半年时间了,最近我又研究出了一些新东西。 相关文章 如何优雅的写C#&#x…...
【JavaEESpring】Spring, Spring Boot 和Spring MVC的关系以及区别
Spring, Spring Boot 和Spring MVC的关系以及区别 Spring:简单来说,Spring 是一个开发应用框架,什么样的框架呢?轻量级、一站式、模块化,其目的是用于简化企业级应用程序开发 Spring的主要功能: 管理对象, 以及对象之…...
【网络编程】传输层——TCP协议
文章目录 TCP协议TCP协议格式窗口大小六个标志位确认应答机制超时重传机制连接管理机制三次握手四次挥手 流量控制滑动窗口拥塞控制延迟应答捎带应答面向字节流粘包问题TCP异常情况TCP小结基于TCP的应用层协议TCP与UDP的对比 TCP相关实验CLOSE_WAIT状态实验TIME_WAIT状态实验TI…...
【数据结构与算法】如何衡量一个算法的好坏?
目录 1. 算法复杂度1.1 时间复杂度1.2 大O渐进表示法1.2.1 例子引入推导大O法1.2.2 举例 1.3 空间复杂度1.3.1 细分1.3.2 举例 2.什么是好的算法?3. 影响程序运行时间的因数 1. 算法复杂度 算法在编写成可执行程序后,运行时需要耗费时间资源和内存资源 。…...
在PostgreSQL中创建和管理数据库
PostgreSQL是一个强大、开源的关系型数据库管理系统,它提供了丰富的功能和灵活的配置选项,使得它成为许多开发者和组织的首选数据库之一,接下来我会介绍如何在PostgreSQL中创建和管理数据库。 一、安装和配置PostgreSQL 第一步,…...
IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...
装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...
定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...
以光量子为例,详解量子获取方式
光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学(silicon photonics)的光波导(optical waveguide)芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中,光既是波又是粒子。光子本…...
用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问(基础概念问题) 1. 请解释Spring框架的核心容器是什么?它在Spring中起到什么作用? Spring框架的核心容器是IoC容器&#…...
音视频——I2S 协议详解
I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议,专门用于在数字音频设备之间传输数字音频数据。它由飞利浦(Philips)公司开发,以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...
GruntJS-前端自动化任务运行器从入门到实战
Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...

