C++ | 五、哈希表 Hash Table(数组、集合、映射)、迭代器

news2024/10/2 12:28:33

哈希表基础

  • 哈希表是一类数据结构(哈希表包含数组、集合和映射,和前两篇文章叙述的字符串、链表平级)
  • 哈希表概念:类似于Python里的字典类型,哈希表把关键码key值通过哈希函数来和哈希表上的索引对应起来,之后输入key值可直接定位到对应索引位置,然后进行取值
  • 哈希表的好处:主要为查找方便,可快速判断一个元素是否在集合中
  • 哈希函数:即关键码key值和存储位置(索引)的对应关系,一个散列函数,比如把小明映射为0,小李映射为1,如图
    • 哈希函数
  • 哈希碰撞
    • 定义:当哈希函数的映射关系把多个关键码映射到了同一个哈希表索引上时,这种现象称为哈希碰撞,如图所示(哈希碰撞有时候是因为关键码的数量大于哈希表的长度,这时不可避免发生碰撞;但是也可能是哈希函数的对应关系不合理,使得即便仍有空索引,还是把部分关键码分配到了同一索引上)
      • 哈希碰撞
    • 其实发生哈希碰撞不见得是个坏事,如果是因为关键码的数量大于哈希表的长度,说明此时哈希表的所有索引都被完全利用,没有发生内存浪费
    • 解决方案一:拉链法
      • 当发生冲突时,在对应索引位置通过链表结构储存多个关键码,如图所示
        • 拉链法
    • 解决方案二:线性探测法
      • 如果是哈希函数的对应关系不合理,使得即便仍有空索引,还是把部分关键码分配到了同一索引上,此时可以利用线性探测法,从发生冲突的索引位置开始,线性查找找到下一个空索引,然后把多余的关键码分配过去,如图所示
        • 线性探测法

常见的三种哈希表结构

  • 数组
  • set集合
    • 是一种数据结构,常用于元素查找的场景
    • 特点:元素不重复(有的具体类实现会允许元素重复,如multiset)、有序(有些具体类实现是无序的如unordered-set)
    • 具体的类实现
      • 第一种,set:有序,即set类中的元素按值的大小排序;基于红黑树实现
      • 第二种,unordered-set:无序,即set类中的元素不按照值的大小排序,而是根据哈希函数的映射结果来;基于哈希表实现
      • 第三种,multiset:允许元素重复;按照元素值的大小排序;基于红黑树实现
      • 具体类的区别
    • 集合类的使用
      • 第一步,引入头文件#include <unordered_set>#include <set>,其中后者同时包含set和multiset类
      • 第二步,创建集合变量,如unordered_set<int> myset;set<int> myset;multiset<int> myset;
      • 第三步,插入或删除元素,使用myset.insert(value);myset.erase(value);
      • 第四步,查找元素,使用myset.find(value),如果找到了,find会返回指向该元素的迭代器(具体见下面对于迭代器的介绍);如果没找到,会返回一个指向集合的 end() 的迭代器。所以通过if myset.find(value) == myset.end()可以判断集合中是否有对应元素
  • map映射

迭代器iterator

  • 迭代器是一种类似于指针的接口,其作用类似于容器(如数组、集合)的下标,可以用来遍历访问容器中的元素,并执行各种操作
  • 容器都拥有begin()end()成员,分别为指向第一个元素和末尾元素的下一个元素(尾后迭代器)的迭代器;如果容器为空,则begin和end返回同一迭代器
  • 对于迭代器的操作
    • 比较大小,直接使用比较运算符比较两个迭代器
    • 移动位置,通过自加、自减运算符移动迭代器的位置
    • 取值,通过解引用*可以获得迭代器指向的对象内容
  • 使用迭代器遍历容器元素的代码如下
#include <iostream>
#include <vector>

using namespace std; 

int main() {
    vector<int> myVector = {1, 2, 3, 4, 5};

    // 使用迭代器遍历容器
      // vector<int>::iterator it  用于创建一个能读取<vector>int 元素的迭代器it,最初指向begin()
      // ++it表示迭代器的移动
    for (vector<int>::iterator it = myVector.begin(); it != myVector.end(); ++it) {
        cout << *it << " "; // 通过解引用获取迭代器所指的对象
    }

    cout << endl; 

    return 0;
}

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

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

相关文章

BGP AS-Path 选路试验

一、拓朴图&#xff1a; 实验要求&#xff1a;R5 通过改变对端传入的 AS-Path 路由策略&#xff0c;使原来较长的 AS-Path 成为最优 二、步骤&#xff1a; 1、配置IP 2、R1、R2、R3 配置 IGP 3、R1、R2、R3 配置 BGP&#xff0c;将 R1 创建的 Loop 100.1.1.1 的环回口在 IBGP …

uni-app小程序:文件下载打开文件方法苹果安卓都适用

api: const filetype e.substr(e.lastIndexOf(.)1)//获取文件地址的类型 console.log(文档,filetype) uni.downloadFile({url: e,//e是图片地址success(res) {console.log(res)if (res.statusCode 200) {console.log(下载成功,);var filePath encodeURI(res.tempFilePath);…

【第三课课后作业】基于 InternLM 和 LangChain 搭建你的知识库

基于 InternLM 和 LangChain 搭建你的知识库 1. 基础作业&#xff1a; 环境配置 1.1 InternLM 模型部署 创建开发机 进入 conda 环境之后&#xff0c;使用以下命令从本地一个已有的 pytorch 2.0.1 的环境&#xff0c;激活环境&#xff0c;在环境中安装运行 demo 所需要的依…

【赠书第17期】Excel高效办公:文秘与行政办公(AI版)

文章目录 前言 1 了解Excel的强大功能和工具 2 提升Excel技能的方法 3 结合AI技术提升Excel应用 4 注意事项 5 推荐图书 6 粉丝福利 前言 随着人工智能&#xff08;AI&#xff09;技术的快速发展&#xff0c;我们的工作方式也在发生深刻变革。其中&#xff0c;Excel 作…

Ubuntu上安装部署Qt

首先需要下载对应的虚拟机软件和ubuntu镜像&#xff0c;虚拟机软件使用VMware或者Virtual Box都行&#xff0c;我用的是前者&#xff0c;这里是VMware的下载链接&#xff1a;下载 VMware Workstation Pro | CN。Ubuntu镜像推荐去清华的网站下载&#xff1a;Index of /ubuntu-re…

如何查找设备的公共IP地址?这里提供三种方法

每个以某种方式连接到互联网的设备都有一个IP地址。这是你的设备使用的唯一标识符,可以被互联网或本地网络上的其他设备识别。 如果你使用的是直接连接到互联网的智能手机或平板电脑等设备,你的公共IP地址将由你的移动运营商直接分配。 另一方面,如果你使用的是连接到本地…

CentOS 系统创建网卡bond0

很多时候在机房运维的过程中&#xff0c;我们会遇到客户要求的建立网卡光口的bond0设置&#xff0c;通俗点说就是将两个光口合并为一个口进行链接设置。创建这个设置是有两种设置&#xff0c;一是在安装系统的过程中对bond0进行创建设置&#xff0c;另一种就是通过系统里面对网…

MAX27——处理max模型导出Zbrush中,无UV,或者UV炸开,反向等问题。

现在很多小伙伴要做数字人的时候会用到zbrush拓补高模。制作法线。有些人喜欢在zbrush中去做封套。也有喜欢直接用max做低模&#xff0c;做好的uv导入到Zbrush中&#xff0c;直接把高模法线&#xff0c;烘焙到低模UV的。这里主要讲解以下max导出到zbrush中&#xff0c;UV炸开&a…

SpringMvc中拦截器的配置及应用

拦截器原理 在 Spring MVC 中&#xff0c;拦截器&#xff08;Interceptor&#xff09;是一种机制&#xff0c;用于拦截请求并在处理程序&#xff08;Controller&#xff09;执行之前或之后执行一些操作。拦截器允许您在请求的不同阶段&#xff08;如处理程序执行前、处理程序执…

【C++干货基地】namespace超越C语言的独特魅力(文末送书)

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引入 哈喽各位铁汁们好啊&#xff0c;我是博主鸽芷咕《C干货基地》是由我的襄阳家乡零食基地有感而发&#xff0c;不知道各位的…

学习笔记之——3D Gaussian SLAM,SplaTAM配置(Linux)与源码解读

SplaTAM全称是《SplaTAM: Splat, Track & Map 3D Gaussians for Dense RGB-D SLAM》&#xff0c;是第一个&#xff08;也是目前唯一一个&#xff09;开源的用3D Gaussian Splatting&#xff08;3DGS&#xff09;来做SLAM的工作。 在下面博客中&#xff0c;已经对3DGS进行了…

[计算机提升] Bitlocker驱动器加密与关闭

4.12 Bitlocker驱动器加密与关闭 BitLocker驱动器加密是一种安全功能&#xff0c;主要用于保护计算机中的数据免受未经授权的访问和泄漏。它通过加密Windows操作系统卷上存储的所有数据提供保护。 BitLocker的使用可确保计算机即使在无人参与、丢失或被盗的情况下也不会被篡改…

Cesium叠加超图二维服务、三维场景模型

前言 Cesium作为开源的库要加超图的服务则需要适配层去桥接超图与Cesium的数据格式。这个工作iClient系列已经做好&#xff0c;相比用过超图二维的道友们可以理解&#xff1a;要用Openlayer加载超图二维&#xff0c;那就用iClient for Openlayer库去加载&#xff1b;同样的要用…

如何用GPT进行绘图?

详情点击链接&#xff1a;如何用GPT进行绘图&#xff1f; 一OpenAI 1.最新大模型GPT-4 Turbo 2.最新发布的高级数据分析&#xff0c;AI画图&#xff0c;图像识别&#xff0c;文档API 3.GPT Store 4.从0到1创建自己的GPT应用 5. 模型Gemini以及大模型Claude2二定制自己的GP…

【python题解11】 输入两个非负十进制整数A和B以及D(进制数),输出A+B的D(1< D ≤ 10)进制数。

1. 题目&#xff1a;输入两个非负十进制整数A和B以及D&#xff08;进制数&#xff09;&#xff0c;输出AB的D&#xff08;1< D ≤ 10&#xff09;进制数。 输入格式: 在一行中依次给出三个整数A、B和D&#xff08;进制数&#xff09;。 输出格式: AB的D进制数。 2. 主要考…

如何使用 Helm 在 K8s 上集成 Prometheus 和 Grafana|Part 3

在本教程的前两部分&#xff0c;我们分别了解和学习了Prometheus 和 Grafana 的基本概念和使用的前提条件&#xff0c;以及使用 Helm 在 Kubernetes 上安装 Prometheus。 在今天的教程中&#xff0c;我们将为你介绍以下内容&#xff1a; 安装 Grafana&#xff1b;集成 Promethe…

开源网安推出“国产替代续航惠企计划”,实现“两不三保”目标

​随着全球安全威胁态势越发严峻&#xff0c;国内网络安全监管趋严&#xff0c;Adobe、Tableau、Salesforce、Nutanix、Citrix、checkmarx等外企陆续裁员离华&#xff0c;国产替代从战略层的备选项&#xff0c;也将逐步变为需要快速落地的必选项。 为了确保用户能高效应对外企离…

[C++]:12:模拟实现list

[C]:12:模拟实现list 一.看一看SGI的stl_list的源码&#xff1a;1.基础结构构造函数1.节点结构&#xff1a;2.节点构造函数&#xff1a;3.链表结构&#xff1a;4.链表的构造函数&#xff1a; 2.析构1.节点析构&#xff1a;2.链表的析构&#xff1a; 3.迭代器 二.模拟实现list1.…

十二款·富文本编辑器:数字创作的瑞士军刀

在数字化时代&#xff0c;内容创作已经成为我们日常生活中不可或缺的一部分。无论是撰写一封电子邮件、准备一份报告、还是在社交媒体上分享心情&#xff0c;文字都是我们表达和沟通的基石。而在这个过程中&#xff0c;富文本编辑器就如同一把瑞士军刀&#xff0c;为我们提供了…

商品详情APP端原数据淘宝数据采集API接口代码接入示例

商品详情APP端原数据API接口&#xff08;接口接入入口&#xff09;的作用是提供APP端商品的详细信息&#xff0c;包括价格、描述、图片、折后价、优惠券信息等。通过调用这个API接口&#xff0c;开发者可以获取到APP端商品详情相关的数据&#xff0c;从而进行数据分析&#xff…