哈希基础概念即使用(C++)

news2024/9/22 11:40:03

目录

1. unordered系列关联式容器

1.1 unordered_map

1.1.1 unordered_map的文档介绍

1.1.2 unordered_map的接口说明

1. unordered_map的构造

2. unordered_map的容量

3. unordered_map的迭代器

4. unordered_map的元素访问

5. unordered_map的查询

6. unordered_map的修改操作

7. unordered_map的桶操作

1.2 unordered_set


1. unordered系列关联式容器

在C++98中,STL提供了底层为红黑树结构的一系列关联式容器,在查询时效率可达到log_2 N,即最差情况下需要比较红黑树的高度次,当树中的节点非常多时,查询效率也不理想。最好的查询是,进行很少的比较次数就能够将元素找到,因此在C++11中,STL又提供了4个 unordered系列的关联式容器,这四个容器与红黑树结构的关联式容器使用方式基本类似,只是其底层结构不同,本文中只对unordered_map和unordered_set进行介绍,unordered_multimap和unordered_multiset大家可查看文档介绍。

1.1 unordered_map

1.1.1 unordered_map的文档介绍

unordered_map在线文档说明(大家复制下面的链接就可以了):

http://www.cplusplus.com/reference/unordered_map/unordered_map/?kw=unordered_map

我总结一下几点:

1. unordered_map是存储键值对的关联式容器,其允许通过keys快速的索引到与其对应的value。

2. 在unordered_map中,键值通常用于唯一的标识元素,而映射值是一个对象,其内容与此 键关联。键和映射值的类型可能不同。

3. 在内部,unordered_map没有对按照任何特定的顺序排序, 为了能在常数范围内找到key所对应的value,unordered_map将相同哈希值的键值对放在相同的桶中。

4. unordered_map容器通过key访问单个元素要比map快,但它通常在遍历元素子集的范围迭代方面效率较低。

5. unordered_maps实现了直接访问操作符(operator[]),它允许使用key作为参数直接访问 value。

6. 它的迭代器至少是前向迭代器。

1.1.2 unordered_map的接口说明

1. unordered_map的构造
unordered_map<string, string> hash;

这就构造好了,跟map是非常相似的。

2. unordered_map的容量
	hash.insert(make_pair("苹果", "apple"));//插入
	//检查是否为空
	cout << hash.empty() << endl;//输出结果false
	//检查有效元素个数
	cout << hash.size() << endl;//输出结果1
3. unordered_map的迭代器

//迭代器
	unordered_map<string, string>::iterator it = hash.begin();
	while (it != hash.end())
	{
		cout << it->second << endl;
		it++;
	}

	//迭代器const
	unordered_map<string, string>::const_iterator cit = hash.cbegin();
	while (cit != hash.cend())
	{
		cout << cit->second << endl;
		cit++;
	}

运行截图:

4. unordered_map的元素访问

cout << hash["苹果"] << endl;

注意:该函数中实际调用哈希桶的插入操作,用参数key与V()构造一个默认值往底层哈希桶 中插入,如果key不在哈希桶中,插入成功,返回V(),插入失败,说明key已经在哈希桶中, 将key对应的value返回。

比如:

	hash["香蕉"] = "banana";
	cout << hash["香蕉"] << endl;

我们的unordered_map中其实并没有香蕉,但我们这样操作后,会给hash里面添加上香蕉

运行截图:

5. unordered_map的查询

	cout << (hash.find("苹果"))->second << endl;
	cout << hash.count("苹果") << endl;

运行截图:

注意:unordered_map中key是不能重复的,因此count函数的返回值最大为1

6. unordered_map的修改操作

代码:

	hash.insert(make_pair("苹果", "apple"));
	hash.insert(make_pair("香蕉", "banana"));
	hash.insert(make_pair("橘子", "orange"));
	unordered_map<string, string>::iterator it = hash.begin();
	while (it != hash.end())
	{
		cout << it->second << endl;
		it++;
	}
	cout << "--------------------------------------------------" << endl;
	hash.erase("橘子");
	it = hash.begin();
	while (it != hash.end())
	{
		cout << it->second << endl;
		it++;
	}
	cout << "--------------------------------------------------" << endl;
	unordered_map<string, string> hash1;
	hash1.swap(hash);
	it = hash1.begin();
	while (it != hash1.end())
	{
		cout << it->second << endl;
		it++;
	}
	cout << "--------------------------------------------------" << endl;
	hash1.clear();
	cout << hash1.size() << endl;

运行截图:

7. unordered_map的桶操作

	hash.insert(make_pair("苹果", "apple"));
	hash.insert(make_pair("香蕉", "banana"));
	hash.insert(make_pair("橘子", "orange"));
	cout << hash.bucket_count() << endl;
	cout << hash.bucket_size(0) << endl;
	cout << hash.bucket("苹果") << endl;

运行截图:

通过以上的代码,我们不难发现,除了多出来的哈希桶部分,unordered_map和map的用法几乎都是一样的,毕竟我们开头也总结过,两则在使用上几乎没有差别,两者的最大区别是在底层结构上。

1.2 unordered_set

参见unondered_set文档说明:

http://www.cplusplus.com/reference/unordered_set/unordered_set/?kw=unordered_set

我们就不多复述了,跟set也是大差不差,无非也会多一个哈希桶的部分。

接下来的底层实现我们会在下一篇文章里详细讲解,我们还会手撕闭散列的开放定址法的哈希表。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

为Jekyll站添加“相关文章“功能

想为本博客添加相关文章功能&#xff0c;因为本站是通过Jekyll搭建的静态站&#xff0c;所以首先想到通过Jekyll相关插件解决&#xff0c;没想到搜遍全网居然未找到可用的插件&#xff0c;无奈最后手敲实现&#xff0c;以下记录折腾过程。 全文详见个人独立博客&#xff1a;ht…

armbian cups 远程打印机 1022

使用 CUPS Web 浏览器界面设置和管理打印机 - Oracle Solaris 管理&#xff1a;常见任务 N1刷armbian变身打印服务器&#xff0c;支持全平台无线打印PC扫描_存储设备_什么值得买 (smzdm.com) 第 6 章 使用 Web 界面向 CUPS 添加打印机 | Red Hat Product Documentation apt…

poi中导入excel时,获取下拉选项、解析从子表引用的下拉选项

我们导入excel表&#xff0c;解析数据时&#xff0c;有的时候需要把单元格是下拉框的所有下拉项拿到&#xff0c;有的下拉项是直接在单元格里面添加的下拉列表&#xff0c;还有的下拉项则是从其它表引用过来的&#xff0c;如下图&#xff1a; 那我们要怎么读取这两种不同方式添…

Python 通过邮件合并(Mail Merge)批量生成Word文档

目录 使用工具 创建邮件合并模板 使用 Python 在 Word 中执行邮件合并 使用 Python 在 Word 中通过邮件合并一次性生成多个文档 使用 Python 获取 Word 中的合并域的名称 邮件合并是 Microsoft Word 中一项非常有用的功能&#xff0c;它让用户能够将事先设计好的模板与数据…

华为云征文 | 华为云Flexus云服务器X实例全面使用操作指南

文章目录 一、华为云Flexus云服务器X实例⛅华为云Flexus云服务器X实例特点☁️为什么选择华为云Flexus云服务器X实例&#xff1f;☀️基于业务负载&#xff0c;灵活调配产品价格 二、快速上手华为云Flexus云服务器X实例⚡注册华为云账号⌚进入Flexus云服务器X实例介绍页面⏰购买…

苹果手机怎么开定位?2个神操作,快速打开定位

网上一直流行着这样一句玩笑话&#xff1a;“出门不开定位导航&#xff0c;就会变成下一个失踪人口。” 这句话也从侧面反映出手机的定位服务对于大部分用户来说非常重要。那么&#xff0c;对于苹果用户来说&#xff0c;苹果手机怎么开定位呢&#xff1f;今天&#xff0c;小编…

利用固定窗口计数算法限流,精准控制第三方 API 调用频率

文章目录 使用场景使用固定窗口计数算法管理调用频率使用测试一秒钟执行五次适用场景 使用场景 在调用第三方 API 时&#xff0c;我们通常会在 API 文档中看到对接口访问频率的限制。为了确保不超出这些限制&#xff0c;使用限流算法来控制 API 调用频率是至关重要的。 在作为…

Spike-in:微生态16S扩增子绝对定量重磅上线!

16S扩增子测序是一种广泛应用于微生物群落分析的技术&#xff0c;主要用于研究环境样本中微生物的种类、丰度及其生态关系。 然而&#xff0c;传统的16S扩增子测序通常只能提供相对丰度数据&#xff0c;无法准确反映样本中各微生物的绝对数量&#xff0c;导致在一定程度上掩盖…

论文理解【LLM-agent】—— 【Reflexion】Language Agents with Verbal Reinforcement Learning

文章链接&#xff1a;Reflexion: Language Agents with Verbal Reinforcement Learning代码&#xff1a;GitHub - noahshinn/reflexion发表&#xff1a;NIPS 2023领域&#xff1a;LLM agent一句话总结&#xff1a;传统强化学习 Agent 通过和环境交互进行试错学习&#xff0c;但…

python-比身高

题目描述 班上有n个同学。现在同学们排成了一队&#xff0c;每个同学都想知道在自己前面有多少个同学比自己高。现在告诉你班上同学们排好队后每个同学的身高&#xff0c;请告诉每个人在他们前面有多少人比他们高。输入&#xff1a; 输入共两行。 第一行一个整数n。 第二行n个整…

实战|任意用户漏洞挖掘分享

吉祥知识星球http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247485367&idx1&sn837891059c360ad60db7e9ac980a3321&chksmc0e47eebf793f7fdb8fcd7eed8ce29160cf79ba303b59858ba3a6660c6dac536774afb2a6330&scene21#wechat_redirect 《网安面试指南》…

变压器电压调节

电压调节是衡量变压器在不同负载条件下维持恒定次级电压的能力的标准&#xff0c;因为输出次级电压可能不是我们所期望的。 当变压器的初级绕组通电时&#xff0c;它会产生次级电压和电流&#xff0c;其量由变压器匝数比 (TR) 决定。如果单相变压器的降压匝数比为 2:1&#xf…

【论文阅读】一种针对多核神经网络处理器的窃取攻击(2020)

摘要 攻击者可以通过侧信道信息(Side-channel)完成模型窃取攻击[17]. [17] Hua W Z, Zhang Z R, Suh G E. Reverse Engineering Convolutional Neural Networks through Side-channel Information Leaks[C]. 2018 55th ACM/ESDA/IEEE Design Automation Conference (DAC), 2018…

Large Language Models(LLMs) Concepts

1、Introduction to Large Language Models(LLM) 1.1、Definition of LLMs Large: Training data and resources.Language: Human-like text.Models: Learn complex patterns using text data. The LLM is considered the defining moment in the history of AI. Some appl…

HMI触屏网关-VISION如何与Modbus TCP从机通信

上文&#xff1a;HMI触屏网关-VISION如何与Modbus RTU从机通信-CSDN博客 1. 硬件连接 Modbus TCP协议采用网口通信的方式&#xff0c;因此&#xff0c;只需要保证网关的LAN口IP和Modbus TCP从机的IP在同一网段即可。 Modbus TCP从机参数说明&#xff1a; 2. VISION创建Modbu…

怎么将ts格式转mp4?必须掌握的4种视频转换方法

当今&#xff0c;视频格式转换变得愈发重要。当我们面对不太常见的ts格式&#xff0c;想要将其转换为更通用的mp4时&#xff0c;掌握正确的转换方法尤为关键。今天&#xff0c;我们将分享4种实现ts格式转mp4的必备方法。每一种方法都有其独特优势&#xff0c;满足不同需求。 我…

027、架构_资源_GTM

系统级GTM:默认的GTM,当创建分片集群时,如果不创建实例级GTM,则会用系统级GTM 本章节主要介绍GTM 集群的新增、删除、配置、绑定等管理操作。 新增GTM集群 摘要新增GTM集群,与租户相绑定,可查看绑定租户与配置集群参数设置,租户可重绑定其他正常可用的GTM集群。 步骤1.…

windows 编译libx264报错问题之解决

编译过程参考&#xff1a;Win10环境下 编译 和 运行 x264_x.264下载使用教程-CSDN博客 一、gcc not found 在https://www.msys2.org/ 下载Mingw后&#xff0c;安装 pacman -S mingw-w64-x86_64-gcc 安装完成后&#xff0c;执行gcc -v提示找不到gcc 解决办法&#xff1a; …

迎接开学第一天!请查收这份2024开学必备好物清单!

新的学期正悄然来临&#xff0c;开学第一天校园里即将迎来一张张充满朝气的面孔。无论是重返课堂的老生还是满怀期待的新生&#xff0c;开学季总是充满了新的希望与挑战。为了帮助学生们更好地适应即将到来的学习生活&#xff0c;我们精心准备了这份2024开学必备好物清单。从提…

Java提高篇——Java 异常处理

阅读目录 异常的概念异常的体系结构Java 异常的处理机制异常处理的基本语法异常链自定义异常总结 回到顶部 异常的概念 异常是程序中的一些错误&#xff0c;但并不是所有的错误都是异常&#xff0c;并且错误有时候是可以避免的。 比如说&#xff0c;你的代码少了一个分号&…