C++模拟实现unordered_map和unordered_set

目录

1.了解哈希表

1.哈希表

1.他的实现原理就是:        ​编辑

2.写单个数据的类型(这边先模拟map的kv类型,后面会再一起改,这边先一步步的先简单实现他)

3.封装整个类:

4.哈希表中存储string

2.哈希桶

3.封装unordered中的哈希桶

4.迭代器的实现

5.封装unordered_map和unordered_set


1.了解哈希表

其实了解这两个库,就知道底层其实是一个哈希表的一个功能。所以我们首先要了解哈希表。

        他其实就是解决在一堆数据里,取寻找某一个数据在不在的一个问题。想想如果让他先排序,然后在找,排序的时间复杂度其实很大了,那有没有办法用o(N)的时间复杂度将这个数据拷贝下来,在以后查找这个数据在不在,时间复杂度都是在0(1)呢?

        其实这个就是哈希实现的功能。

1.哈希表

1.他的实现原理就是:
        

注意看这个18这个数字是不是和2这个位置冲突了,所以我们需要往后面移一个位置,那我们找也一样,也是要往后找,那找到什么时候结束?(就是找到空格结束,还没有找到就是没有;或则最坏的结果就是把这个数组都找完,因为这个数组都填满了这个数据,但是这个情况不会发生,因为我们在写这个底层是,会不断的给他扩容。你想想看,如果都快填满了,那查找它的效率就会明显下降,那就失去了他高效功能的意义了)

2.写单个数据的类型(这边先模拟map的kv类型,后面会再一起改,这边先一步步的先简单实现他)

我上面讲的数组除了存储它的数据,但我举一个例子:

如果我们删除6,再去寻找44就找不到了,所以我们就需要一个状态值了:

所以我们就可以开始第一步了:

3.封装整个类:

先看成员变量:

现在来讲解上面HashFunc是干嘛用的,他其实是一个仿函数,为什么需要仿函数呢?你要知道我们不知道key中存的是什么数据,可以无法整除整数,那就和哈希完全不相关联,所以我们要引入这个模板,当其他人使用这个类时,想存储自定义类型也是可以的,只需要让他写一个仿函数就可以了。

最后还有一点就是扩容不能超过0.7,其实每一个库实现的都不一样,这边其实没有一个统一的划分。

4.哈希表中存储string

这个为什么要单独拿出来讲呢?因为这个会出错:因为字符串转化为整形,很有可能会重叠,所以大佬们也是想了很多办法,但也只能不断地减小误差。

各种字符串Hash函数 - clq - 博客园 (cnblogs.com)

可以去这个网站上了解一下:

我就用最高评分的那种了:

就用一个模板的特例化取解决:

2.哈希桶

        

能明白我的意思把,就是这个数组变成了指针数组,下面是一个链表,只有next的链表。但是库里面比我这个模拟实现还要复杂,下面挂的不是单链表,而是红黑树,其实也不是很难实现,有兴趣的可以自己实现一下:
 

3.封装unordered中的哈希桶

这是单个数据的结点:

下面这个我就先连迭代器一起写进去了,还有一些知识因为在set和map模拟里面我有说过,这些基本是一样的,我就不累赘了,C++模拟实现set和map-CSDN博客

4.迭代器的实现

其实在我们模拟实现中,不应该按照我这个顺序来的,这在set和map那节也说过,这是因为我是已经模拟完了,才过来写这篇博客的。其实正确的模拟顺序是:

1.模拟实现哈希桶

2.初步封装unordered_map和unordered_set。

3.模拟实现迭代器

4.在迭代器中加入const迭代器

5.insert返回值, operator[]

6.map中的key和set不能修改的问题

如果一起直接写完,那必然很容易就会报错,那么就会让你很无从下手,甚至想放弃。

然后我们继续说迭代器。这个迭代器还是比较特殊的。

首先一点就是,我们要想清楚,我们成员变量只有一个Node* 的结点指针是否就够了,看上面那张图,如果结点指针指向了44,我们怎么跳到5?因为我们这个结点只有next,所以只能找到下一个,不能找到上一个,那执行oeprator++就不怎么好执行了,所以我们必须要再加一个成员变量,这个哈希桶的头指针。

但现在其实还有一个问题,我们下面的迭代器类需要_table, HashTable类需要iterator,这个相互牵扯的,每一个类都在在另一个类上面去实现他。所以就需要声明一个类了。

所以:

而且,迭代器中的_pht需要拜访_table,所以还要加一个友元:

最后看一下整体的:

5.封装unordered_map和unordered_set

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

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

相关文章

Unity中Shader优化通用规则

文章目录 前言一、精度优化1、三种精度 fixed / half / float2、位置坐标、物理坐标类使用float3、HDR颜色、方向向量类使用half4、普通纹理、颜色类使用 fixed5、实际上,使用的精度取决于 平台 和 GPU6、现在桌面级GPU都是直接采用 float , Shader中的 fixed / hal…

【Linux】ln命令使用

ln命令 ln是linux中又一个非常重要命令,请大家一定要熟悉。它的功能是为某一个文件在另外一个位置建立一个同步的链接,这个命令最常用的参数是-s,具体用法是:ln –s 源文件 目标文件。 当我们需要在不同的目录,用到相…

分享5款靠谱好用,无广告不流氓的好软件

​ 话不多说,直入正题,全都是靠谱好用,无广告不流氓的好软件,可以先点赞收藏,以后慢慢用。 1.动态壁纸软件——Lively Wallpaper ​ Lively Wallpaper是一款可以将视频、GIF、网页、游戏等内容作为桌面壁纸的软件&am…

移动硬盘显示容量不显示文件怎么办?五种解决方法

移动硬盘是一种常用的便携式存储设备,可以方便地备份和传输大量的数据文件。然而,有时我们可能会遇到一个问题,即移动硬盘显示容量不显示文件怎么办?本文将介绍几种解决方法,希望能帮助大家有效解决问题。 方法一、检…

【JavaWeb】会话过滤器监听器

会话&过滤器&监听器 文章目录 会话&过滤器&监听器一、会话1.1 Cookie1.2 Session1.3 三大域对象 二、过滤器三、监听器3.1 application域监听器3.2 session域监听器3.3 request域监听器3.4 session域的两个特殊监听器3.4.1 session绑定监听器3.4.2 钝化活化监听…

IEC60730-1 Annex-H

IEC-60730安全标准法规由国际电工委员会 ( IEC ) 制定,该安全标准定义了家用电器嵌入式控制软件与硬件安全操作的测试与检测方法,以确保家电中受控设备的安全操作。IEC-60730将家用电器分为3类: A类 – 不用于确保设备的安全性。 例如&#…

深入了解Java8新特性-日期时间API之TemporalQuery、TemporalQueries

阅读建议 嗨,伙计!刷到这篇文章咱们就是有缘人,在阅读这篇文章前我有一些建议: 本篇文章大概2000多字,预计阅读时间长需要5分钟。本篇文章的实战性、理论性较强,是一篇质量分数较高的技术干货文章&#x…

国外客户跟我要佣金,该给不该给?

“Jack,这次你要是不帮我,我就死定了!” 收到美国公司采购Antony的信息时,我有些哭笑不得,因为在我电脑屏幕上除了他的信息外,还有来自他公司监察部门的邮件: “jack先生,我们调查…

PostgreSQL-SQL联表查询LEFT JOIN 数据去重复

我们在使用left join联表查询时,如果table1中的一条记录对应了table2的多条记录,则会重复查出id相同的多条记录。 1、解决方法一 SELECT t1.* FROM table1 t1 LEFT JOIN table2 t2 ON t1.id t2.tid 第一种方法我们发现还是有重复数据 2、解决方法二…

go elasticsearch 测试实例

// 查询列表数据 func QueryOperateList(ctx context.Context, esClient *elastic.Client, index string, pageNum, pageSize int, start, end int64, execSql string, list []interface{}, operateAccount string, operateAddr string, maxRows, minRows int, dbAddr, namespa…

版本控制系统Git学习笔记-Git基本知识介绍

目录 前言一、版本控制系统1.1 什么是版本控制系统1.2 本地版本控制系统1.3 集中化的版本控制系统1.3 分布式版本控制系统 二、Git简介2.1 数据处理方式2.2 几个特点2.2.1 几乎所有操作都是本地执行2.2.2 Git保证完整性2.2.3 Git一般只添加数据 2.3 Git中文件状态2.3.1 三种文件…

抖音直播招聘报白如何提高求职者体验?

为了提升抖音直播招聘报白中求职者的体验,以下是一些建议: 提供清晰的招聘流程和信息。在直播招聘开始之前,企业或人力资源公司应提供清晰的流程和信息,包括直播时间和直播平台, 职位信息,招聘要求等&…

为什么要在项目中使用TypeScript?

随着越来越多的开发人员采用TypeScript,人们需要了解在下一个项目中应该使用TypeScript的原因。尽管它在早期应用中遇到了一些阻力,但在过去十年,它迅速成为一种广泛使用的编程语言。 以下介绍如何使用TypeScript以及它给开发人员带来的一些好…

Java核心知识点整理大全24-笔记

22. 数据结构 22.1.1. 栈(stack) 栈(stack)是限制插入和删除只能在一个位置上进行的表,该位置是表的末端,叫做栈顶 (top)。它是后进先出(LIFO)的。对栈的基…

思维模型 仰巴脚效应

本系列文章 主要是 分享 思维模型,涉及各个领域,重在提升认知。不完美才美。 1 仰巴脚效应的应用 1.1 “仰巴脚效应”在人际沟通领域的应用 美国总统罗斯福在竞选总统时,曾经有一位歌唱家计划为他举办一场音乐会以助选。然而,这…

波特图频率定位

生产波特图 设置坐标轴到指定位置 截至频率设置到-3db 对应的频率为158.777 Hz 同理就算对应的容抗 为 1002欧姆电阻 通过计算对应的阻抗。 特此记录 anlog 2023年11月30日

瑜伽学习零基础入门,各种瑜伽教学方法全集

一、教程描述 练习瑜伽的好处多多,能够保证平衡健康的身体基础,提升气质、塑造形体、陶冶情操,等等。本套教程是瑜伽的组合教程,共由33套视频教程组合而成,包含了塑身纤体,速效瘦身,四季养生&a…

SpringCloudAlibaba微服务 【实用篇】| Nacos配置管理

目录 一:Nacos配置管理 1. 统一配置管理 2. 配置热更新 3. 配置共享 4. 搭建Nacos集群 tips:前些天突然发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家,感兴趣的同学可以进…

InfluxDB相关概念

概念 database:数据库,用来针对于不同应用进行数据隔离measurement:数据库中的表,类似与关系型数据库中 tablepoints:表里面的一行数据。相当于关系库中表中一条记录,由时间戳(time&#xff09…

数据库系统原理——备考计划2:数据库系统的概述

前言: 基于课本、上课ppt、复习总结ppt进行一个知识点的罗列,方便后期高效地复习 目录 前言: 一、基本概念 1.数据: (1)概念: (2)数据的种类: (3&…