探索哈希表:C++中的实现与操作详解【Map、Set、数据结构】
探索哈希表:C++中的实现与操作详解
介绍
哈希表(Hash Table)是一种常见的数据结构,它提供了一种高效的键值对存储方式,能够快速进行插入、删除和查找操作。在这篇博客中,我们将详细介绍哈希表的概念、在C++中的实现方式以及常见操作的示例。我们还会讨论 unordered_set
,一种用于集合操作的哈希表,常用于需要去重的场景。
什么是哈希表?
哈希表是一种通过哈希函数将键映射到存储桶(Bucket)或槽(Slot)中的数据结构。其核心思想是使用哈希函数将键转换为数组的索引,从而能够在常数时间内(平均情况下)进行查找、插入和删除操作。
哈希表的基本概念
- 哈希函数:将输入的键转换为数组的索引。
- 存储桶:数组中的位置,每个存储桶可以存储一个或多个键值对。
- 冲突处理:当两个不同的键被哈希到相同的索引时,需要解决冲突。常见的冲突处理方法有链地址法(Chaining)和开放地址法(Open Addressing)。
在C++中实现哈希表
在C++中,我们可以使用STL库中的unordered_map
来实现哈希表。unordered_map
是一个关联容器,提供了哈希表的所有基本操作。下面是一个简单的示例:
示例代码
#include <iostream>
#include <unordered_map>
#include <string>int main() {// 创建一个unordered_mapstd::unordered_map<std::string, int> hashTable;// 插入键值对hashTable["apple"] = 1;hashTable["banana"] = 2;hashTable["orange"] = 3;// 查找键值对std::string key = "banana";if (hashTable.find(key) != hashTable.end()) {std::cout << key << " found with value " << hashTable[key] << std::endl;} else {std::cout << key << " not found" << std::endl;}// 删除键值对hashTable.erase("orange");// 遍历哈希表for (const auto& pair : hashTable) {std::cout << pair.first << ": " << pair.second << std::endl;}return 0;
}
详细实现与操作
-
创建哈希表
- 使用
std::unordered_map
可以很方便地创建一个哈希表。键和值的类型可以根据需要进行指定。
std::unordered_map<std::string, int> hashTable;
- 使用
-
插入键值对
- 可以使用下标操作符或
insert
方法来插入键值对。
hashTable["apple"] = 1; hashTable["banana"] = 2; hashTable.insert({"orange", 3});
- 可以使用下标操作符或
-
查找键值对
- 使用
find
方法可以查找键是否存在于哈希表中,返回一个迭代器。如果键存在,迭代器指向键值对;否则,迭代器指向end
。
std::string key = "banana"; if (hashTable.find(key) != hashTable.end()) {std::cout << key << " found with value " << hashTable[key] << std::endl; } else {std::cout << key << " not found" << std::endl; }
- 使用
-
删除键值对
- 使用
erase
方法可以删除指定键的键值对。
hashTable.erase("orange");
- 使用
-
遍历哈希表
- 可以使用范围循环或迭代器遍历哈希表中的所有键值对。
for (const auto& pair : hashTable) {std::cout << pair.first << ": " << pair.second << std::endl; }
unordered_set
的讲解与使用场景
unordered_set
是什么?
unordered_set
是 C++ 标准模板库(STL)中的一种集合容器,它基于哈希表实现,用于存储不重复的元素。与 unordered_map
类似,unordered_set
提供了快速的插入、删除和查找操作。
unordered_set
的典型使用场景
unordered_set
最常用于需要去重的场景。例如,我们有一个包含重复元素的数组,需要快速去重并保留唯一元素。在这种情况下,unordered_set
是一个理想的选择。
示例代码
#include <iostream>
#include <unordered_set>
#include <vector>int main() {// 创建一个unordered_setstd::unordered_set<int> hashSet;// 插入元素hashSet.insert(1);hashSet.insert(2);hashSet.insert(3);hashSet.insert(2); // 插入重复元素// 查找元素int key = 2;if (hashSet.find(key) != hashSet.end()) {std::cout << key << " found in the set" << std::endl;} else {std::cout << key << " not found in the set" << std::endl;}// 删除元素hashSet.erase(2);// 遍历哈希集合for (const auto& elem : hashSet) {std::cout << elem << " ";}std::cout << std::endl;// 使用unordered_set去重std::vector<int> nums = {1, 2, 3, 4, 5, 1, 2, 3};std::unordered_set<int> uniqueNums(nums.begin(), nums.end());// 输出去重后的结果for (const auto& elem : uniqueNums) {std::cout << elem << " ";}std::cout << std::endl;return 0;
}
详细实现与操作
-
创建哈希集合
- 使用
std::unordered_set
可以方便地创建一个集合,用于存储不重复的元素。
std::unordered_set<int> hashSet;
- 使用
-
插入元素
- 可以使用
insert
方法来插入元素。重复的元素不会被插入到集合中。
hashSet.insert(1); hashSet.insert(2); hashSet.insert(3); hashSet.insert(2); // 插入重复元素
- 可以使用
-
查找元素
- 使用
find
方法可以查找元素是否存在于集合中,返回一个迭代器。如果元素存在,迭代器指向元素;否则,迭代器指向end
。
int key = 2; if (hashSet.find(key) != hashSet.end()) {std::cout << key << " found in the set" << std::endl; } else {std::cout << key << " not found in the set" << std::endl; }
- 使用
-
删除元素
- 使用
erase
方法可以删除指定的元素。
hashSet.erase(2);
- 使用
-
遍历哈希集合
- 可以使用范围循环或迭代器遍历集合中的所有元素。
for (const auto& elem : hashSet) {std::cout << elem << " "; } std::cout << std::endl;
-
使用
unordered_set
去重- 可以将一个包含重复元素的数组转换为
unordered_set
,从而实现去重。
std::vector<int> nums = {1, 2, 3, 4, 5, 1, 2, 3}; std::unordered_set<int> uniqueNums(nums.begin(), nums.end());// 输出去重后的结果 for (const auto& elem : uniqueNums) {std::cout << elem << " "; } std::cout << std::endl;
- 可以将一个包含重复元素的数组转换为
总结
哈希表是一种高效的数据结构,广泛应用于需要快速查找、插入和删除操作的场景中。在C++中,std::unordered_map
和 std::unordered_set
提供了便捷的哈希表实现。通过本文的介绍和示例代码,我们了解了哈希表的基本概念及其在C++中的实现和常见操作。希望这些内容能帮助你更好地理解和使用哈希表。
相关文章:
探索哈希表:C++中的实现与操作详解【Map、Set、数据结构】
探索哈希表:C中的实现与操作详解 介绍 哈希表(Hash Table)是一种常见的数据结构,它提供了一种高效的键值对存储方式,能够快速进行插入、删除和查找操作。在这篇博客中,我们将详细介绍哈希表的概念、在C中的…...
Python酷库之旅-第三方库Pandas(062)
目录 一、用法精讲 241、pandas.Series.view方法 241-1、语法 241-2、参数 241-3、功能 241-4、返回值 241-5、说明 241-6、用法 241-6-1、数据准备 241-6-2、代码示例 241-6-3、结果输出 242、pandas.Series.compare方法 242-1、语法 242-2、参数 242-3、功能 …...
python学习之旅(基础篇看这篇足够了!!!)
目录 前言 1.输入输出 1.1 输入 1.2 输出 2. 变量与常量 2.1 变量 2.2 常量 2.3 赋值 2.4格式化输出 3. 数据类型 4. 四则运算 5.“真与假” 5.1 布尔数 5.2 比较运算和逻辑运算 5.3 布尔表达式 6.判断语句 6.1 基本的if语句 6.2 if-else语句 6.3 if-elif-el…...
Azure OpenAI Embeddings vs OpenAI Embeddings
题意:Azure OpenAI 嵌入与 OpenAI 嵌入的比较 问题背景: Is anyone getting different results from Azure OpenAI embeddings deployment using text-embedding-ada-002 than the ones from OpenAI? Same text, same model, and the results are cons…...
重生奇迹MU职业成长三步走
在重生奇迹MU游戏中,转职是最重要的玩法之一。每个职业在转职后都会发生巨大的变化,经过三次转职后,你才有资格成为该游戏中最强大的冒险者。 一转,一切才刚刚开始 玩家完成第一次转职任务后,标志着我们成功度过了游…...
2024年中国数据中台行业研究报告
数据中台丨研究报告 核心摘要: 数据中台是企业数字化建设的重要构成,其通过整合企业基础设施和数据能力,实现数据资产化和服务复用,降低运营成本,支撑业务创新。受宏观经济影响,部分企业减少了对数据中台等…...
MySQL——数据表的基本操作(一)创建数据表
数据库创建成功后,就需要创建数据表。所谓创建数据表指的是在已存在的数据库中建立新表。需要注意的是,在操作数据表之前,应该使用 “ USE 数据库名 ” 指定操作是在哪个数据库中进行,否则会抛出 “ No database selected ” 错误。创建数据表…...
EPLAN EDZ 文件太大导入很慢如何解决?
目前各个品牌都在提供 EPLAN EDZ部件库文件,但是一般都是一个总的EDZ文件,导入过程中,因为电脑配置和其他问题,导致导入过程中EPLAN会崩溃或者长时间不动。 我们分析下EDZ文件的构成,这是个压缩文件,换了个壳而已。用压缩软件把edz打开,这里不是解压,直接右键,用解压…...
刷题——缺失的第一个正整数
缺失的第一个正整数_牛客题霸_牛客网 我选择了一个我比较能看懂的, int minNumberDisappeared(vector<int>& nums) {// write code heremap<int, int>hash;int n nums.size();//哈希表记录数组中出现的每个数字for(int i 0; i < n; i)hash[n…...
代理设置--一些库的代理设置
首先最好能获取一个免费代理,来继续下面的阅读和实验 也可以在本机设置代理,具体流程由于比较敏感,请自行搜索 代理设置成功后的测试网站是 http://www.httpbin.org/get , 访问该链接可以得到请求相关的信息,返回结果中的 ori…...
Debezium系列之:PostgreSQL数据库赋予账号数据采集权限的详细步骤
Debezium系列之:PostgreSQL数据库赋予账号数据采集权限的详细步骤 一、账号需要的权限二、创建账号,赋予登陆、复制权限三、赋予账号数据库权限四、赋予账号对表的权限五、创建PostgreSQL数据库复制组六、账号权限授予完整案例七、扩展——分区表设置八、扩展-撤销账号的权限…...
javascript:判断输入值是数字还是字母
1 代码示例 要判断输入值是数字还是字母,我们可以通过JavaScript获取输入框的值,然后使用isNaN函数来检查输入值是否为数字。 <!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title><s…...
Java-排序算法-复盘知识点
刷了24道简单排序题,18道中等排序题之后,给排序算法来个简单的复盘(从明天开始刷动态规划咯) 1.对于找多数元素(出现次数超过一半的元素)可以使用摩尔投票法。 2.HashSet的add方法非常实用:如…...
HarmonyOS 原生智能之语音识别实战
HarmonyOS 原生智能之语音识别实战 背景 公司很多业务场景使用到了语音识别功能,当时我们的语音团队自研了语音识别模型,方案是云端模型加端侧SDK交互,端侧负责做语音采集、VAD、opus编码,实时传输给云端,云端识别后…...
基于Gromacs的蛋白质与小分子配体相互作用模拟教程
在生命科学的广阔领域中,蛋白质与小分子配体之间的相互作用扮演着至关重要的角色。这些相互作用不仅影响着生物体内的各种生命活动,如信号传导、代谢调控和药物作用等,同时也是药物设计和开发的核心内容。因此,深入理解并模拟这些…...
Ubuntu下python3.12安装, 分布式 LLM 推理 exo 安装调试过程, 运行自己的 AI 集群
创作不易 只因热爱!! 热衷分享,一起成长! “你的鼓励就是我努力付出的动力” —调试有点废,文章有点长,希望大家用心看完,肯定能学废,感谢. 1. Ubuntu下python3.12安装 1.1 导入 Python 的稳定版 PPA,不用编译 sudo add-apt-repository ppa:deadsnakes/ppa sudo…...
pytest-bdd 行为驱动自动化测试
引言 pytest-bdd 是一个专为Python设计的行为驱动开发(BDD)测试框架,它允许开发人员使用自然语言(如Gherkin)来编写测试用例,从而使测试用例更易于理解和维护。 安装 通过pip安装 pip install pytest-b…...
PostgreSQL11 | 触发器
本文章代码已在pgsql11.22版本上运行且通过,展示页由pgAdmin8.4版本提供 上一篇总结了原著的第十章有关pgsql的视图的用法,本篇将总结pgsql的触发器的用法。 触发器 使用触发器可以自动化完成一些在插入数据或修改数据时,某些需要同期同步的…...
cesium canvas广告牌
在有些业务中,对场景中的广告牌样式要求比较高,需要动态显示一些数据,这个时候,我们可以通过将复杂背景样式制作成图片,通过canvas绘制图片和动态数据,从而达到比较好的显示效果。 1 CanvasMarker 类封装 …...
使用Floyd算法求解两点间最短距离
Floyd算法 Floyd算法又称为Floyd-Warshell算法,其实Warshell算法是离散数学中求传递闭包的算法,两者的思想是一致的。Floyd算法是求解多源最短路时通常选用的算法,经过一次算法即可求出任意两点之间的最短距离,并且可以处理有负权…...
linux“how_paras.sh“ E212: 无法打开并写入文件
经过一番测试和查找, [6localhost bin]$ find / -name "hello.sh" 2>/dev/null /home/6/bin/hello.sh [6localhost bin]$ ls hello.sh ls: 无法访问hello.sh: 没有那个文件或目录,为什么在/bin文件下却不能打开, [6localhost …...
CSS mask-image 实现边缘淡出过渡效果
使用场景 在生产环境中,遇到一个需求,需要在一个深色风格的大屏页面中,嵌入 Google Maps。为了减少违和感,希望地图四边能够淡出过渡。 这里的“淡出过渡”,关键是淡出,而非降低透明度。 基于 Google Ma…...
电子元器件—电容和电感(一篇文章搞懂电路中的电容和电感)(笔记)(面试考试必备知识点)电容和电感作用、用途、使用、注意事项、特点等(面试必备)-笔记(详解)
作者:Whappy 座右铭:不曾拥有,何来失去! 时间:2024年8月2日08:40:04 一、电容的作用 储能: 电容器通过充电储存电荷在电容板上,形成电场储存电能。当需要释放储存的电能时,电荷…...
2024HDU Contest 5 Problem 5
题目链接 从大到小枚举gcd的值 d d d,以及编号为 d d d的倍数的点, [ d , 2 d , 3 d , … ] [d,2d,3d,\dots] [d,2d,3d,…]。 然后对于任何一条边 ( x , y ) (x,y) (x,y),如果 x x x的子树和 y y y的子树里都有编号为 d d d倍数的点…...
nGQL入门
引言 nGQL(NebulaGraph Query Language)是用于操作 NebulaGraph 的查询语言。它的语法类似于 Cypher,但有自己独特的特性。以下是一些 nGQL 的基本语法和操作示例,以帮助你入门。 基本概念 节点(Vertex)…...
[CP_AUTOSAR]_系统服务_DEM模块(二)功能规范介绍
目录 1、DEM 功能规范描述1.1、Startup behavior1.2、Monitor re-initialization 在前面 《[CP_AUTOSAR]_系统服务_DEM模块(一)》文中,简要介绍了 DEM 模块的功能、与其它模块之间的功能交互,本文将接着介绍 DEM 模块的功能规范。…...
Linux中yum、rpm、apt-get、wget的区别,yum、rpm、apt-get常用命令,CentOS、Ubuntu中安装wget
文章目录 一、常见Linux发行版本二、Linux中yum、rpm、apt-get、wget的区别2.1 yum2.2 rpm2.3 apt-get2.4 wget2.5 总结 三、CentOS中yum的作用3.1 yum清空缓存列表3.2 yum显示信息3.3 yum搜索、查看3.4 yum安装3.5 yum删除、卸载程序3.6 yum包的升级、降级 四、Ubuntu中apt-ge…...
IPython的使用技巧2
关注我,持续分享逻辑思维&管理思维&面试题; 可提供大厂面试辅导、及定制化求职/在职/管理/架构辅导; 推荐专栏《10天学会使用asp.net编程AI大模型》,目前已完成所有内容。一顿烧烤不到的费用,让人能紧跟时代的…...
win10打开程序闪退的解决方法,亲测好用
当我们在使用win10系统的时候,可能会遇到安装某些程序后无法正常使用,一打开就闪退,或者点击右下角图标就消失了,而其他程序却可以正常打开使用。下面小编就来和大家分享亲测好用的win10打开程序闪退的解决办法。 问题原因分析&a…...
木舟0基础学习Java的第二十一天(数据库,MySQL,SQLyog)
数据库 数据库:按照数据结构来组织 存储数据的厂库 数据管理系统(Database Management System,DBMS):一套操作和管理数据库的软件 用于简历 使用 维护数据库 关系型数据库:采用关系模型作为数据组织方式 逻辑结构是一张二维表 由行和列组成…...
蓝色网站特点/湖南seo优化推荐
resize2fsresize2fs命令被用来增大或者收缩未加载的“ext2/ext3”文件系统的大小。如果文件系统是处于mount状态下,那么它只能做到扩容,前提条件是内核支持在线resize。linux kernel 2.6支持在mount状态下扩容但仅限于ext3文件系统。语法resize2fs(选项)…...
wordpress 日期/杭州seo代理公司
Sed简介sed 是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲…...
网站运营名词解释/深圳网络提速优化服务包
2019独角兽企业重金招聘Python工程师标准>>> jQuery有3种针对文档加载的方法 $(document).ready(function() {// ...代码... }) //document ready 简写 $(function() {// ...代码... }) $(document).load(function() {// ...代码... }) 一个是ready一个是load&#…...
洛阳平台公司/seo成都培训
可以使用 IN 子句代替许多 OR 条件。要想理解 IN 子句,还以表 employee_tbl 为例,它的所有记录如下所示:mysql> SELECT * FROM employee_tbl;--------------------------------------------| id | name | work_date | daily_typing_pages …...
公众号制作培训/搜索引擎优化分析
参考链接 https://tangshusen.me/Dive-into-DL-PyTorch/#/chapter04_DL_computation/4.4_custom-layer 不含模型参数的自定义层 与使用Module类构造模型类似。下面的CenteredLayer类通过继承Module类自定义了一个将输入减掉均值后输出的层,并将层的计算定义在了f…...
zencart网站地图插件/如何制作小程序
1.不可变 String类初始化后是不可变的(immutable),首先,我建议先看看String类的源码实现,这是从本质上认识String类的根本出发点。从中可以看到: 1、String类是final的,不可被继承。public final class String。2、Str…...