今日更新了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需要传第二个参数:哈希表的指针。
前言 哈希类的实现参考上一篇文章:【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、实现哈希表
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
前言 前面的文章我们学习了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增加这个模板参数: 那哈希表里面这个缺省参数我们就不用传了。
键和映射值的类型可能不同 在内部,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
但是上述的映射方法存在一个问题,就是不同的元素可能会映射到同一个位置,这时就发生了哈希冲突(也叫哈希碰撞),解决哈希冲突,是实现哈希结构的关键。...哈希函数的设计要保证高效性和可靠性: 一致性:确保相同的输入总是产生相同的输出哈希值 均匀分布:哈希值应在哈希表的地址空间中尽可能均匀分布,以减少哈希冲突 计算效率:哈希函数应简单且计算快速,以便在实际应用中能够快速执行...冲突最小化:设计哈希函数时应尽量减少哈希冲突的发生,以提高哈希表的性能 | 常见哈希函数: 哈希函数是哈希表的核心,它决定了如何将关键字映射到哈希地址。...哈希函数设计的越好,产生哈希冲突的可能性就越低,但是哈希冲突还是无可避免。 3、哈希冲突 解决哈希冲突的两种常见方法是:闭散列(开放定址法)和开散列(链地址法)。...方法二:因为方法一还需要重写一遍映射过程,所以可以直接新建一个哈希表,遍历原表的元素插入到新建的哈希表中,最后交换两个哈希表的vector,这个方法的好处是新建的哈希表复用了原哈希表的Insert。
位图 是 哈希思想 的一种应用,哈希表 映射数据时使用的是 vector,而 位图 映射数据时使用的是 比特位,没错,就是只能表示 0 和 1 的比特位(使用直接定址法,只能判断整型) 为什么 位图 能解决这种海量数据问题...因为位图是哈希的应用,查找速度非常快,并且因为位图使用的是最小的单元:比特,空间利用率极高,而这就是【腾讯】这道面试题的最优解 解题思路:首先 40 亿个无符号的整数,重点在 无符号,这就意味着借助下标可以映射所有的数...mb,就这点内存占用,随便给(某鹅厂应用占用内存随便都是几百兆) 位图的工作原理 在 C++ 中提供了位图结构 bitset(需要包含头文件 ) ---- 3、位图的模拟实现...(使用开散列实现的哈希表),首先是找到位于哪一个 桶 中,然后去 桶 中遍历查找,不过这里的 桶 是 下标,表示属于数组中的哪一个元素,桶中的值 表示元素中的 比特位 千言万语不如一张图说明问题: 所以我们模拟实现的...布隆 ---- 总结 以上就是本次关于 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结果字符串哈希函数转换得到的整数是相同的,那么模出来的小标位置也是相同的
这个算法由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
然而,在实际编程过程中,我们经常会遇到一个棘手的问题——如何在循环中控制异步函数的执行次数。这不仅关乎代码的效率,更关乎程序的稳定性和可维护性。...然而,如果不加以控制,异步函数可能会在循环中多次调用,导致请求过多,进而触发目标网站的反爬虫机制。如何优雅地管理异步函数的执行次数,成为我们面临的一个重要挑战。...解决方案为了有效管理异步函数在循环中的执行次数,我们可以使用以下几种技术:Promise.all:通过Promise.all并发执行多个异步函数,并在所有Promise完成后进行处理。...async/await:使用async/await控制异步函数的执行顺序,确保在每次迭代中异步函数只执行一次。...在本示例中,我们将结合async/await和爬虫代理IP技术,演示如何在循环中优雅地管理异步函数的执行次数。案例分析我们将编写一个NodeJS爬虫程序,通过爬虫代理服务抓取目标网站的数据。
✨个人主页: 北 海 所属专栏: 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
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.
本篇博客讲解: 运算符重载的规则,以及实例 运算符重载的规则 被重载的运算符必须是已经存在的C++运算符,不能重载自己创建的运算符。 运算符被重载之后,原有功能仍然保留。...重载不能改变运算符运算对象的个数。 +运算符具有两个操作数,在+运算符函数作为类(例如上个例子中的CTime)的成员函数的时候,有一个参数是隐含的,也就是当前的对象,使用this指针来引用。...->(成员访问运算符) 、[] (下标运算符)、.new/delete、>>、<< 不能重载的运算符: ?...(成员访问运算符) *(成员指针访问运算符) ::(域运算符) sizeof(sizeof 是运算符,而不是函数) 不需要重载的运算符 =(赋值)和&(取地址符) 因为编译器会为每个类自动实现一个默认的赋值运算符...如 有的运算符必须定义为类的成员函数 =、赋值运算符 []、下标运算符 () 函数调用运算符 有的运算符不能定义为类的成员函数,只能定义为类的友元 > 运算符重载可以在函数内执行任意的操作
,我们需要对其进行改造,完善哈希桶,使其最终能封装出 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++【哈希表的完善及封装】的全部内容了,在本文中,我们首先将 哈希表 进行了完善
/unordered_multimap、unordered_set/unordered_multiset它们的底层是哈希表,至于什么是哈希表,大家有的可能听说过,有的可能没有,没关系,我们后面会讲。...首先我们可以看一下unordered_map的接口: 常用的接口还是那几个,跟map的用法一样,还有一些看不懂的,我们现在不用管,那些是跟他的底层结构哈希有关的。...我们可以跟set对比一下 那unordered_map,也简单演示一下: 我们可以用unordered_map来跑一下那个统计次数的程序: 同样我们可以和map对比一下 其实还是有序无序的区别...其实在文档里面也有一些说明 比如我们看unordered_map ,由于它底层使用的哈希结构,使得它们能够更快的按照键值去访问某个元素。...: 综合而言,unordered系列的效率是比较高的,尤其是find的效率(因为它底层的哈希结构,这个我们后面会讲)。
我们之前提到过C++中的函数重载,可以根据形参的不同调用不同的函数,那么运算符重载跟函数重载的实现形式差不多,运算符重载的一般写法为返回值 operator运算符(参数列表)。...,可以实现 a+b+c 类型的操作,这种情况下先执行 a+b ,返回值再与 c 相加。...在这里如果对引用不是很清楚的可以移步另一篇文章:C++中指针与引用详解 - ZhiboZhao - 博客园 (cnblogs.com)。...,能够实现 cout << a << b <<...<< endl 的效果,此过程中先执行 cout << a,返回值再执行 下一个左移运算符。...++p 执行结束后,a=6,p=6。
本文主要介绍unordered_map与unordered_set的封装,此次封装主要用上文所说到的开散列,通过开散列的一些改造来实现unordered_map与unordered_set的封装 一、...如果是unordered_map容器,那么它传入底层哈希表的模板参数就是Key和Key和Value构成的键值对,如果是unordered_set容器,那么它传入底层哈希表的模板参数就是Key和Key...Key;如果是unordered_map,结点当中存储的就是键值对: 哈希表仿函数的支持:KeyOfT 我们通过哈希计算出对应的哈希地址:但是插入的时候就不能直接用data去进行比较了...---- 三、正向迭代器 哈希表的正向迭代器对哈希表指针和结点指针进行了封装,++运算符重载,可以访问下一个非空的桶,所以每个正向迭代器里面存的是哈希表地址。...,并没有反向迭代器,所以没有实现–-运算符的重载,若是想让哈希表支持双向遍历,可以考虑将哈希桶中存储的单链表结构换为双链表结构。
include using namespace std; class Person { public: int a; int b; //通过成员函数重载加号运算符...Person p3; p3 = p1 + p2; //p3=p1.operator+(p2); //p3=operator+(p1,p2); cout << "p3的a...=" << p3.a << endl; cout << "p3的b=" << p3.b << endl; } int main() { test(); system("pause...需要注意的是运算符重载,也可以发生函数重载。
C++的移动赋值运算符是一种特殊的赋值运算符,用于将资源从一个对象转移到另一个对象而不进行深拷贝。移动赋值运算符通常用于支持移动语义,以提高代码的效率和性能。...通过使用右值引用,我们可以获取到要赋值的源对象,并将其资源移动到目标对象中。 在移动赋值运算符中,通常会执行以下操作: 检查是否为自赋值情况,如果是则直接返回当前对象。...在移动赋值运算符中,我们首先检查是否为自赋值情况,如果不是则释放当前对象的资源,并将源对象的资源指针赋值给目标对象data,然后将源对象的资源指针置为nullptr。...这会触发移动赋值运算符的调用,将资源从str1移动到str2,最终输出"Hello"。 使用移动赋值运算符可以避免不必要的数据拷贝,特别是当对象拥有大量资源时,移动语义可以显著提高代码的性能和效率。...移动赋值运算符通常与移动构造函数一起使用,以实现资源的有效管理和转移。
在C++编程领域,std::unordered_map作为一个无序关联容器,因其高效的平均时间复杂度(接近O(1)的查找、插入和删除操作)而广受青睐。...一、unordered_map基础回顾 基本概念 std::unordered_map基于哈希表实现,它存储键值对(key-value pairs),并且不保证元素的顺序。...键冲突(哈希碰撞) 问题:不同的键可能产生相同的哈希值,导致冲突。 解决:unordered_map内部通过链地址法或开放寻址法处理冲突。开发者无需直接干预,但应尽量选择好的哈希函数减少冲突概率。...内存管理与性能调优 问题:不当的装载因子(load factor)设置可能导致频繁的哈希表重哈希,影响性能。...解决:确保键类型支持哈希操作(有std::hash特化)且定义了等价关系(通过Key的==运算符)。
领取专属 10元无门槛券
手把手带您无忧上云