数据结构: 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 第一步,…...

从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...

微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...

SpringCloudGateway 自定义局部过滤器
场景: 将所有请求转化为同一路径请求(方便穿网配置)在请求头内标识原来路径,然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...
【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具
第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...

Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...
#Uniapp篇:chrome调试unapp适配
chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...