数据结构: 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 + find
		bool 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

效果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/127481.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

『Nacos』 入门教程

前言 本文为 Nacos 平台快速入门教程&#xff0c;本文将会使用通俗易懂的语言手把手带您了解、使用 Nacos 平台&#xff0c;适合未接触过 Nacos 的初学者 官方手册&#xff1a;Nacos | Nacos 官方仓库&#xff1a;alibaba/nacos 版本&#xff1a;2.X 本文示例代码仓库&#xf…

Ansible自动化运维工具(常用模块与命令)

ansible基于Python开发&#xff0c;实现了批量系统配置&#xff0c;批量程序部署&#xff0c;批量运行命令等功能 ansible特点 部署简单&#xff0c;只需在主控端部署Ansible环境&#xff0c;被控端无需做任何操作&#xff1b;默认使用ssh协议对设备进行管理&#xff1b;有大…

更改 npm的默认缓存地址

npm的默认缓存一般在C:\Users\用户名\AppData\Roaming路径下的npm和npm_cache&#xff0c;而c盘往往空间不大。 1、在其他盘新建两个文件夹&#xff0c;如D盘&#xff0c;node_cache和node_global。如下图所示。 2、在cmd中执行npm config set prefix “node_cache的路径”&a…

InSAR数据处理、地形三维重建、形变信息提取、监测丨GMTSAR合成孔径雷达干涉测量丨GNSS、北斗高精度数据处理

目录 ①合成孔径雷达干涉测量InSAR数据处理、地形三维重建、形变信息提取、监测等应用 ②基于GMTSAR合成孔径雷达干涉测量InSAR数据处理、形变信息提取与分析 ③GNSS、北斗高精度数据处理暨新版GAMITGLOBK软件应用 更多应用 ①合成孔径雷达干涉测量InSAR数据处理、地形三维…

网络层+数据链路层+物理层

一)网络层协议: 一)IP协议报头介绍: 咱们的IP协议能够在两点之间规划处一条合适的路径&#xff0c;什么叫做合适&#xff1f;那就得看咱们的TOS是怎么进行选的&#xff0c;比如说选择最大吞吐量&#xff0c;咱们就需要进行选择一个最大的带宽路径&#xff1b; 16位总长度:IP数据…

json字符串转为开闭区间

1.需求背景 1.1 前端页面展示 1.2 前后端约定交互json 按照页面每一行的从左到右 * 示例 [{"leftSymbol":">","leftNum":100,"relation":"无","rightSymbol":null,"rightNum":0}, {"left…

用于强化学习的置换不变神经网络

一、介绍 如果强化学习代理提供的输入在训练中未明确定义&#xff0c;则通常表现不佳。一种新方法使 RL 代理能够正常运行&#xff0c;即使受到损坏、不完整或混乱的输入的影响也是如此。 “大脑能够使用来自皮肤的信息&#xff0c;就好像它来自眼睛一样。我们不是用眼睛看&…

笔记本电脑的麦克风没有声音

笔记本电脑的麦克风没有声音是一个常见的问题&#xff0c;可能是由于以下几个原因导致的&#xff1a; 第一&#xff0c;麦克风没有启用或者被禁用了。在Windows系统中&#xff0c;右键单击任务栏上的音量图标&#xff0c;选择“录音设备”&#xff0c;在弹出窗口中找到麦克风&a…

Webpack--动态 import 原理及源码分析

前言 在平时的开发中&#xff0c;我们经常使用 import()实现代码分割和懒加载。在低版本的浏览器中并不支持动态 import()&#xff0c;那 webpack 是如何实现 import() polyfill 的&#xff1f; 原理分析 我们先来看看下面的 demo function component() {const btn docume…

JavaScript_Node节点属性_nodeName

nodeName属性&#xff1a;返回节点的名称 节点的类型有七种 Document&#xff1a;整个文档树的顶层节点 DocumentType&#xff1a;doctype标签 Element&#xff1a;网页的各种HTML标签 Attribute&#xff1a;网页元素的属性 Text&#xff1a;标签之间或标签包含的文本 C…

box-shadow用法详解

1、box-shadow概述 用来实现对元素产生阴影效果 1.1、box-shadow常用属性 box-shadow: h-shading v-shading blur spread color inset; box-shadow: X轴偏移量 Y轴偏移量 阴影模糊半径 阴影扩展半径 阴影颜色 投影方式…

完蛋!我被LLM包围了!上个时代的开发者被干掉了;ChatGPT高质量科普视频;垂直领域大模型的思考;百度智能云黑客松 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f440; 百度智能云 | 千帆大模型平台黑客马拉松 https://segmentfault.com/e/1160000044353489 百度智能云携手 SegmentFault 思否&#xff0…

如何理解CDN?说说实现原理?

面试官&#xff1a;如何理解CDN&#xff1f;说说实现原理&#xff1f; 一、是什么 CDN (全称 Content Delivery Network)&#xff0c;即内容分发网络 构建在现有网络基础之上的智能虚拟网络&#xff0c;依靠部署在各地的边缘服务器&#xff0c;通过中心平台的负载均衡、内容分…

数据结构与算法—冒泡排序快速排序

目录 一、交换排序 二、冒泡排序 时间复杂度 三、快速排序 1、三种一次划分操作 Hoare法 挖洞法 前后指针法 三种方法总结&#xff1a; 2、改进划分效率 3、递归实现快速排序 4、非递归实现快速排序 栈的函数&#xff1a; 非递归排序函数&#xff1a; 5、时…

MySQL常用时间函数

1.NOW()&#xff1a;返回当前日期和时间。 SELECT NOW()2.CURDATE()&#xff1a;返回当前日期。 SELECT CURDATE();3.CURTIME()&#xff1a;返回当前时间。 SELECT CURTIME();4.DATE()&#xff1a;提取日期或日期时间表达式的日期部分。 SELECT DATE(NOW());5.TIME()&#…

8 mysql中的索引2

一、索引的种类 1、 B树索引 1.**每个索引就是一颗B树**&#xff0c;二级索引不包含行记录的全部数据 2.叶子节点除了包含键值以外&#xff0c;每个叶子节点中的索引行中还包含了一个书签( bookmark) 3.B平衡树是一颗查找树&#xff0c;B树的叶子节点用来放数据的,并且所有叶…

开发知识点-golang

golang语言学习 环境搭建win10配置go环境 ubuntu20.04安装golang介绍下载 Go 压缩包调整环境变量验证 Go 安装过程 环境搭建 win10配置go环境 中文网进行下载 https://studygolang.com/dl 配置环境变量 增加GOROOT: 新建 -->变量名为: GOROOT(必须大写) 变量值: 你安装…

CSS3 用户界面、图片、按钮

一、CSS3用户界面&#xff1a; 在CSS3中&#xff0c;增加了一些新的用户界面特性来调整元素尺寸、框尺寸和外边框。CSS3用户界面属性&#xff1a;resize、box-sizing、outline-offset。 1、resize&#xff1a; resize属性指定一个元素是否应该由用户去调整大小。 <style…

C++类和对象(上)

目录 C入门知识补充auto关键字&#xff08;C11&#xff09;基于范围的for循环&#xff08;C11&#xff09;nullptr&#xff08;C11&#xff09; 类和对象面向过程 OR 面向对象初步认识类的引入类的定义类的访问限定符类的作用域类的实例化类对象模型计算类对象的大小 在这里插入…

虚幻C++基础 day4

虚幻中的UI 虚幻中的比较常用的UI&#xff1a;Widget Blueprint又称UMG虚幻中的两种布局&#xff1a; 网格布局锚布局 创建Widget Blueprint 网格布局 有点类似Qt中的网格布局&#xff0c;将UI面板进行行列切分Horizontal Box&#xff1a;水平分布Vertical Box&#xff1a;…