首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C++】unordered_set和unordered_map封装(哈希

今日更新了unordered_map和unordered_set封装相关内容 欢迎大家关注点赞收藏⭐️留言 key和pair 前面已经实现了哈希底层,现用哈希进行封装。...unordered_set和unordered_map封装和map、set大体思路一样。...hash是底层,他并不知道传入是k还是pair,但是上层unordered_set和unordered_map知道。...仿函数hash 由于hash现在是底层,我们仿函数不可能直接传给hash底层,所以得在unordered_set和unordered_map上传多一个模板参数,这样取模仿函数就可以在外面传了。...迭代器 当遍历完一个桶后,准备找下一个桶时,就需要有哈希表,不然就找不到下一个桶,所以iterator需要传第二个参数:哈希指针。

11310

C++高阶】哈希应用(封装unordered_map和unordered_set)

前言 哈希实现参考上一篇文章:【C++高阶】哈希函数底层原理全面探索和深度解析-CSDN博客 之前我们已经学习了如何手搓哈希,现在让我们来对哈希进行改造,并且封装成unordered_map和unordered_set...哈希改造 改造HashTable以适配unordered_map和unordered_set容器,主要涉及到如何根据这两种容器特性来设计和实现HashTable节点存储以及相应操作。...,则为K KeyOfT:通过T来获取key一个仿函数类 Hash: 哈希函数仿函数对象类型,哈希函数使用除留余数法,需要将Key转换为整形数字才能取模 // unordered_set 与 unordered_map...Unordered_Map模拟实现 5.1 Unordered_Map设计 template> class unordered_map...size_t _n; //表中存储数据个数 }; } 以上就是哈希改造全部内容,让我们来总结以下哈希实现及改造封装吧 ——————————步骤—————————— 1、实现哈希

9310
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    C++】使用哈希表模拟实现STL中unordered_set和unordered_map

    前言 前面的文章我们学习了unordered_set和unordered_map使用以及哈希表,并且我们提到了unordered_set和unordered_map底层结构其实就是哈希表。...那这篇文章我们就对之前我们实现哈希表(拉链法实现那个)进行一个改造,并用它模拟实现一下unordered_set和unordered_map。...一.哈希表模板改造+封装unordered_set和unordered_map 首先可以带大家再来简单看一下库里面的哈希源码: 我们来看一下这几个模板参数 第一个value就决定了哈希表里面每个...然后end用空构造就行了 6. unordered_set和unordered_map迭代器封装 那哈希迭代器实现好,我们就可以封装unordered_set和unordered_map迭代器了...那我们哈希表是有这个模板参数,但是我们现在得给unordered_set和unordered_map增加这个模板参数: 那哈希表里面这个缺省参数我们就不用传了。

    17910

    nodejs中事件循环中执行顺序

    nodejs 事件循环是一个典型生产者/消费者模型,异步 I/O、网络请求等是事件生产者,源源不断为 Node 提供不同类型事件,这些事件被传递到对应观察者那里,事件循环则从观察者那里取出事件并处理...除了用户代码无法并行执行外,所有的 I/O(磁盘 I/O 和网络 I/O 等)是可以并行起来。...console.log("读取文件内容2,等待3 秒后输出"); process.nextTick(() => { console.log("读取文件内容2,等待3 秒后执行...// start // Promise-1 // 在每轮循环中,会将 process.nextTick 全部执行完,优先级> promise.then // process.nextTick-1 /.../ 读取文件内容2 // 读取文件内容2,等待3 秒后输出 // 读取文件内容2,等待3 秒后执行 process.nextTick

    1.8K30

    c++哈希>unordered容器&&哈希表&&哈希桶&&哈希应用详解

    键和映射值类型可能不同 在内部,unordered_map没有对按照任何特定顺序排序, 为了能在常数范围内找到key所对应value,unordered_map将相同哈希键值对放在相同桶中...作为参数直接访问value 它迭代器至少是前向迭代器 1.1.2 unordered_map接口说明 1.1.2.1 unordered_map构造 1.1.2.2 unordered_map容量...1.1.2.3 unordered_map迭代器 1.1.2.4 unordered_map元素访问 注意:该函数中实际调用哈希插入操作,用参数key与V()构造一个默认值往底层哈希桶中插入...,如果key不在哈希桶中,插入成功,返回V(),插入失败,说明key已经在哈希桶中,将key对应value返回 1.1.2.5 unordered_map查询 1.1.2.6 unordered_map...// unordered_map中存储是pair键值对,K为key类型,V为value类型,HF哈希函数类型 // unordered_map在实现时,只需将hashbucket

    19910

    C++】精妙哈希算法

    但是上述映射方法存在一个问题,就是不同元素可能会映射到同一个位置,这时就发生了哈希冲突(也叫哈希碰撞),解决哈希冲突,是实现哈希结构关键。...哈希函数设计要保证高效性和可靠性: 一致性:确保相同输入总是产生相同输出哈希值 均匀分布:哈希值应在哈希地址空间中尽可能均匀分布,以减少哈希冲突 计算效率:哈希函数应简单且计算快速,以便在实际应用中能够快速执行...冲突最小化:设计哈希函数时应尽量减少哈希冲突发生,以提高哈希性能 | 常见哈希函数: 哈希函数是哈希核心,它决定了如何将关键字映射到哈希地址。...哈希函数设计越好,产生哈希冲突可能性就越低,但是哈希冲突还是无可避免。 3、哈希冲突 解决哈希冲突两种常见方法是:闭散列(开放定址法)和开散列(链地址法)。...方法二:因为方法一还需要重写一遍映射过程,所以可以直接新建一个哈希表,遍历原表元素插入到新建哈希表中,最后交换两个哈希vector,这个方法好处是新建哈希表复用了原哈希Insert。

    6510

    C++ 哈希应用【位图】

    位图 是 哈希思想 一种应用,哈希表 映射数据时使用是 vector,而 位图 映射数据时使用是 比特位,没错,就是只能表示 0 和 1 比特位(使用直接定址法,只能判断整型) 为什么 位图 能解决这种海量数据问题...因为位图是哈希应用,查找速度非常快,并且因为位图使用是最小单元:比特,空间利用率极高,而这就是【腾讯】这道面试题最优解 解题思路:首先 40 亿个无符号整数,重点在 无符号,这就意味着借助下标可以映射所有的数...mb,就这点内存占用,随便给(某鹅厂应用占用内存随便都是几百兆) 位图工作原理 在 C++ 中提供了位图结构 bitset(需要包含头文件 ) ---- 3、位图模拟实现...(使用开散列实现哈希表),首先是找到位于哪一个 桶 中,然后去 桶 中遍历查找,不过这里 桶 是 下标,表示属于数组中哪一个元素,桶中值 表示元素中 比特位 千言万语不如一张图说明问题: 所以我们模拟实现...布隆 ---- 总结 以上就是本次关于 C++ 哈希应用【位图】全部内容了,在本文中,首先引入了一道来自【腾讯】海量数据面试题,明确需要使用 位图 解决问题,简单模拟实现位图之后,又引入了几道海量数据面试题

    28930

    C++哈希应用 -- 位图

    常规解题思路是排序 + 二分,或者将数据插入到 unordered_map/unordered_set,然后进行查找;但是这两个方法在这里都不行,因为数据量太大了,内存中存放不下; 1G空间大约有10...数据范围 (特别注意这里N不是数据个数),因为C++中最小数据类型是 char,占一个字节空间,而一个字节中有8个比特位,可以标识8个元素,所以在构造函数中我们将 vector resize 到...N/8+1 即可,这里加1是因为 C++除法是整数除法,即直接舍弃余数,所以我们需要多开辟一个字节空间。...---- 三、bitset C++ 中其实也提供了类似于位图这样东西,只是 C++ 把它叫做位集合 – bitset,它功能比我们自己模拟实现要更加丰富,不过主要功能比如 set、reset 和...= HashFunc(IP) % 100; //100为小文件个数 经过哈希切割后,相同IP一定会被划分到同一个小文件中,因为相同IP结果字符串哈希函数转换得到整数是相同,那么模出来小标位置也是相同

    38010

    Swisstable:C++中比std::unordered_map更快hash表

    这个算法由google开源,最早在2017年c++大会上分享过。...众所周知(我最喜欢问面试题),解决hash冲突有以下经典三种方式:开放地址法相邻地址法多散列函数法重点在于,std::unordered_map使用开放地址法来解决hash冲突。...uint8_t meta_table[MAX_ITEMS]; //元数据表,用于解决hash冲突 }; ​hashcode通过在key上执行hash函数,得到一个64位hash值。...Army Knife of Hashmaps(翻译和解读)Zhihu 流左沙:新式哈希表 - Swiss Tablesgoogle开源abseil库Swiss Tables Design Notesc...)Abseil - C++ Common Libraries源码C语言实现版本:Swissmaprust语言实现:hashbrown用代码生成方法来提供swisstable: github, google

    1.6K20

    NodeJS技巧:在循环中管理异步函数执行次数

    然而,在实际编程过程中,我们经常会遇到一个棘手问题——如何在循环中控制异步函数执行次数。这不仅关乎代码效率,更关乎程序稳定性和可维护性。...然而,如果不加以控制,异步函数可能会在循环中多次调用,导致请求过多,进而触发目标网站反爬虫机制。如何优雅地管理异步函数执行次数,成为我们面临一个重要挑战。...解决方案为了有效管理异步函数在循环中执行次数,我们可以使用以下几种技术:Promise.all:通过Promise.all并发执行多个异步函数,并在所有Promise完成后进行处理。...async/await:使用async/await控制异步函数执行顺序,确保在每次迭代中异步函数只执行一次。...在本示例中,我们将结合async/await和爬虫代理IP技术,演示如何在循环中优雅地管理异步函数执行次数。案例分析我们将编写一个NodeJS爬虫程序,通过爬虫代理服务抓取目标网站数据。

    10110

    C++哈希模拟实现】

    ✨个人主页: 北 海 所属专栏: C++修行之路 操作环境: Visual Studio 2019 版本 16.11.17 ---- 前言 哈希核心思想是 映射,对数据键值进行处理后...unordered_set 和 unordered_map 就是使用 哈希桶 封装实现,就像 红黑树 封装 set 和 map 那样 不过我们当前 哈希桶 仍然存在不少问题且不够完善,在下一篇文章中...,我们首先对其进行完善,然后直接利用一个 哈希桶 封装实现 unordered_set 与 unordered_map ---- 3、源码 本文中涉及所有代码位于下面这个 Gitee 仓库中 《哈希模拟实现...》 ---- 总结 以上就是本次关于 C++哈希模拟实现】全部内容了,在本文中,我们主要对哈希两种实现方式:闭散列与开散列(哈希桶)进行了简单模拟实现,学习了 线性探测 和 单链表 这两种哈希冲突解决方法...,之前觉得没什么用单链表,在此处闪闪发光 ---- 相关文章推荐 C++ 进阶知识 C++【初识哈希C++【一棵红黑树封装 set 和 map

    23110

    map 学习(下)——C++ hash_map, unordered_map

    map 学习(下)——C++ hash_map, unordered_map 接上篇《map 学习(一)——C++中 map 使用》。...一、hash_map 参考《C++ STL中哈希表 hash_map介绍》即可。博主写很详细。 注: hash_map 不是标准。...所以如果有平台移植内容,尽量少用 hash_map。 二、unordered_map 以下内容翻译自《unordered_map - C++ Reference》。 1....它可以使实现了函数调用运算符类,或者指向函数指针(具体请详细参阅示例构造函数)。它默认值是 equal_to ,它返回与等号运算符 operator(a==b) 相同值。...三、map, hash_map, unordered_map 区别 参考网址: 《c++中map与unordered_map区别》 《C++中map和hash_map区别》 1.

    13.4K91

    C++C++运算符重载规则

    本篇博客讲解: 运算符重载规则,以及实例 运算符重载规则 被重载运算符必须是已经存在C++运算符,不能重载自己创建运算符运算符被重载之后,原有功能仍然保留。...重载不能改变运算符运算对象个数。 +运算符具有两个操作数,在+运算符函数作为类(例如上个例子中CTime)成员函数时候,有一个参数是隐含,也就是当前对象,使用this指针来引用。...->(成员访问运算符) 、[] (下标运算符)、.new/delete、>>、<< 不能重载运算符: ?...(成员访问运算符) *(成员指针访问运算符) ::(域运算符) sizeof(sizeof 是运算符,而不是函数) 不需要重载运算符 =(赋值)和&(取地址符) 因为编译器会为每个类自动实现一个默认赋值运算符...如 有的运算符必须定义为类成员函数 =、赋值运算符 []、下标运算符 () 函数调用运算符 有的运算符不能定义为类成员函数,只能定义为类友元 > 运算符重载可以在函数内执行任意操作

    57730

    C++哈希完善及封装】

    ,我们需要对其进行改造,完善哈希桶,使其最终能封装出 unordered_set 与 unordered_map ---- ️正文 1、哈希完善 1.1、拷贝与赋值 单链表 是我们自己写,其中涉及到了...:3634、5100、3702 显然此时值更为分散,符合我们需求 关于 static_cast 这是 C++ 中提供类型转换函数,static_cast 相当于 C语言 中 隐式类型转换...就连封装时遇到问题都差不多 2.1、解决 k/v 参数冲突问题 unordered_set 需要 k 模型,而 unordered_map 需要 k/v 模型 为了满足 不同 需求,需要对 哈希表...iterator 对于 哈希表 类来说,主要改动其实就两个:模板参数改变、获取哈希表对象 key 值 如此一来,unordered_set 与 unordered_map 只需要提供符合自己特色...后成品;HashTable-副本.hpp 是纯净版哈希表 《哈希完善及封装》 ---- 总结 以上就是本次关于 C++哈希完善及封装】全部内容了,在本文中,我们首先将 哈希表 进行了完善

    32060

    C++unordered_map和unordered_set使用 及 OJ练习

    /unordered_multimap、unordered_set/unordered_multiset它们底层是哈希表,至于什么是哈希表,大家有的可能听说过,有的可能没有,没关系,我们后面会讲。...首先我们可以看一下unordered_map接口: 常用接口还是那几个,跟map用法一样,还有一些看不懂,我们现在不用管,那些是跟他底层结构哈希有关。...我们可以跟set对比一下 那unordered_map,也简单演示一下: 我们可以用unordered_map来跑一下那个统计次数程序: 同样我们可以和map对比一下 其实还是有序无序区别...其实在文档里面也有一些说明 比如我们看unordered_map ,由于它底层使用哈希结构,使得它们能够更快按照键值去访问某个元素。...: 综合而言,unordered系列效率是比较高,尤其是find效率(因为它底层哈希结构,这个我们后面会讲)。

    30310

    C++移动赋值运算符

    C++移动赋值运算符是一种特殊赋值运算符,用于将资源从一个对象转移到另一个对象而不进行深拷贝。移动赋值运算符通常用于支持移动语义,以提高代码效率和性能。...通过使用右值引用,我们可以获取到要赋值源对象,并将其资源移动到目标对象中。 在移动赋值运算符中,通常会执行以下操作: 检查是否为自赋值情况,如果是则直接返回当前对象。...在移动赋值运算符中,我们首先检查是否为自赋值情况,如果不是则释放当前对象资源,并将源对象资源指针赋值给目标对象data,然后将源对象资源指针置为nullptr。...这会触发移动赋值运算符调用,将资源从str1移动到str2,最终输出"Hello"。 使用移动赋值运算符可以避免不必要数据拷贝,特别是当对象拥有大量资源时,移动语义可以显著提高代码性能和效率。...移动赋值运算符通常与移动构造函数一起使用,以实现资源有效管理和转移。

    40130

    C++一分钟之-扁平化映射与unordered_map

    C++编程领域,std::unordered_map作为一个无序关联容器,因其高效平均时间复杂度(接近O(1)查找、插入和删除操作)而广受青睐。...一、unordered_map基础回顾 基本概念 std::unordered_map基于哈希表实现,它存储键值对(key-value pairs),并且不保证元素顺序。...键冲突(哈希碰撞) 问题:不同键可能产生相同哈希值,导致冲突。 解决:unordered_map内部通过链地址法或开放寻址法处理冲突。开发者无需直接干预,但应尽量选择好哈希函数减少冲突概率。...内存管理与性能调优 问题:不当装载因子(load factor)设置可能导致频繁哈希表重哈希,影响性能。...解决:确保键类型支持哈希操作(有std::hash特化)且定义了等价关系(通过Key==运算符)。

    12310

    C++】开散列实现unordered_map与unordered_set封装

    本文主要介绍unordered_map与unordered_set封装,此次封装主要用上文所说到开散列,通过开散列一些改造来实现unordered_map与unordered_set封装 一、...如果是unordered_map容器,那么它传入底层哈希模板参数就是Key和Key和Value构成键值对,如果是unordered_set容器,那么它传入底层哈希模板参数就是Key和Key...Key;如果是unordered_map,结点当中存储就是键值对: 哈希表仿函数支持:KeyOfT 我们通过哈希计算出对应哈希地址:但是插入时候就不能直接用data去进行比较了...---- 三、正向迭代器 哈希正向迭代器对哈希表指针和结点指针进行了封装,++运算符重载,可以访问下一个非空桶,所以每个正向迭代器里面存哈希表地址。...,并没有反向迭代器,所以没有实现–-运算符重载,若是想让哈希表支持双向遍历,可以考虑将哈希桶中存储单链表结构换为双链表结构。

    18520
    领券