首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏芝士就是菜

    哈希(unordered_map、unordered_set)

    unordered系列关联式容器 内部是无序的,查询很快 几个函数说明: 函数声明 功能介绍 operator[] 返回与key对应的value值 bucket_count() 返回桶的个数 size_t bucket_size(size_t n)const 返回n号桶有效元素的个数 size_t bucket(const K& key) 返回元素key对应的桶号 底层结构 unordered系列的关联式容器之所以效率比较高 unordered_map和unordered_set封装 hash表(开散列) 几个点: 模板类,第一个模板参数是K,第二个参数T,上层决定这个T是什么 传入仿函数KeyOfT,这个可以从T类型中取K unordered_map的底层是哈希表,第二个模板参数传个pair<K,V>,同时要配对应的仿函数,返回first #pragma once #include "hash.h" namespace st { template <class K, class V, class Hash = HashFunc<K>> class unordered_map {

    56520编辑于 2023-04-20
  • 来自专栏c语言,c++

    【C++】哈希(unordered_set、unordered_map)

    unordered_set的使用 unordered_set、unordered_map跟set和map的使用差不多,只是unordered是无序的,且迭代器是单向的。 unordered_map的使用 unordered_map也是无序的。 unordered_map是存储键值对的关联式容器,其允许通过keys快速的索引到与其对应的value。 在内部,unordered_map没有对按照任何特定的顺序排序, 为了能在常数范围内找到key所对应的value,unordered_map将相同哈希值的键值对放在相同的桶中。 unordered_map容器通过key访问单个元素要比map快,但它通常在遍历元素子集的范围迭 代方面效率较低。 底层结构 unordered系列的关联式容器之所以效率比较高,是因为其底层使用了哈希结构。

    32110编辑于 2024-08-14
  • 来自专栏文章部

    哈希封装unordered_map和unordered_set

    哈希表的改造 咱们这里还是跟Map和Set的封装一样的道理,没有必要为了unordered_map和unordered_set传的参数不同就实例化两份代码,可以直接通过模板参数来解决。 那么unordered_map传的是pair<key,value>,unordered_set传的是key。 unordered_set和unordered_map具体实现 3.1 unordered_set具体实现 那么到此时,unordered_set的具体实现已经很清楚了。 这里我们要知道unordered_set里面的元素key是不能被改变的,所以为其附上const的枷锁。 具体实现 同样,unordered_map的具体实现已经很清楚了。

    28010编辑于 2024-06-06
  • 来自专栏萌新的日常

    【C++】unordered_set 和 unordered_map 使用 | 封装

    使用 unordered_map官方文档 ---- unordered_set 官方文档 ---- set / map与unordered_set / unordered_map 使用功能基本相同,但是两者的底层结构不同 头文件,在其中创建命名空间unordered_set 在unordered_set中实现一个仿函数, unordered_set 的第二个参数 为 K unordered_set作为 K 模型 ,所以 T应传入K ---- 创建 unordered_map.h头文件,在其中创建命名空间unordered_map unordered_map 的第二个参数 为 pair<cosnt K,V> 类型 与unordered_set , 若为unordered_set ,则输出 K类型的K 若为unordered_map ,则输出 KV类型的K ---- hashi++,计算下一个桶的位置,判断是否为空 unordered_map对于 begin和end的复用 在 unordered_map中使用哈希桶中的HashTable的迭代器 来实现unordered_map的迭代器 ---- unordered_map

    59340编辑于 2023-10-17
  • 来自专栏C/C++的自学之路

    【C++】unordered_set和unordered_map

    unordered_set类 unordered_set类的介绍 1. 在使用unordered_set类时,必须包含 #include <unordered_set> 这一行。 1. unordered_set<int> us1,什么也不需要传入,构造一个空的unordered_set类对象。 3. unordered_set<int> us3(const unordered_set<int>& us2),使用另一个unordered_set类对象进行拷贝构造。 2. unordered_set.erase(int num),向unordered_set类对象中删除整数num,如果删除unordered_set类对象没有的元素,则删除失败。 } unordered_map类对象的修改操作 1. unordered_map.insert({key,value}),向unordered_map类对象中插入键值对,如果插入unordered_map

    36910编辑于 2025-06-10
  • 来自专栏学习

    【C++】unordered_map与unordered_set使用

    1.unordered_set系列的使用 1.1参考文档 https://legacy.cplusplus.com/reference/unordered_set/ 1.2unordered_set类的介绍 unordered_set的声明如下,Key就是unordered_set底层关键字的类型 unordered_set默认要求Key⽀持转换为整形,如果不⽀持或者想按⾃⼰的需求⾛可以⾃⾏实现⽀ = allocator<Key> // unordered_set::allocator_type > class unordered_set; 1.3unordered_set unordered_set和set的第⼀个差异是对key的要求不同,set要求Key⽀持⼩于⽐较,⽽ unordered_set要求Key⽀持转成整形且⽀持等于⽐较,要理解unordered_set /unordered_multiset unordered_multimap/unordered_multiset跟multimap/multiset功能完全类似,⽀持Key冗余。

    37400编辑于 2025-01-13
  • C++之unordered_set和unordered_map基本介绍

    unordered_set和unordered_map是两个非常重要的关联容器,它们提供了基于哈希表的快速查找、插入和删除操作。 unordered_set:存储唯一键的集合,每个元素只出现一次 unordered_map:存储键值对,每个键唯一对应一个值 一.unordered_set 1.1概述 unordered_set 是一个不包含重复元素的集合容器 性能差异 unordered_set的增删查改更快⼀些,因为红⿊树增删查改效率是O(logN) ,⽽哈希表增删查平均效率是O(1) 二、unordered_map 2.1概述 unordered_map 与 unordered_set 类似unordered_map 中的元素顺序是无序的。 二、unordered_map 对 key 的要求 unordered_map 是基于哈希表实现的无序关联容器,它对键的要求主要体现在以下几个方面: (一)必须能够计算哈希值 由于 unordered_map

    12810编辑于 2026-01-15
  • 来自专栏羚羊角的特别专栏

    【C++】unordered_set和unordered_map的实现

    本篇unordered_set和unordered_map的实现基于: 自己实现的hash表 【C++】哈希表的实现(链地址法) 与map和set差不多的实现手法:【C++】模拟实现map和set 先测试unordered_set的。 再测试一下unordered_map的。 unordered_set修改如下。 unordered_map修改如下。 我们测试一下。 unordered_set和unordered_map的实现就到这里,我们下篇见~

    21300编辑于 2025-07-11
  • 哈希表——unordered_set和unordered_map的封装

    My_unordered_map的成员变量只要一个哈希表就行。 有了上面的铺垫后My_unordered_map的基本功能和迭代器实现就显得十分简单在这里就不再细讲,我会在文尾分享源码。 2.My_unordered_set.h的封装 关于My_unordered_set的封装逻辑和My_unordered_map是一模一样的就不细讲。 非常感谢您能耐心读完这篇文章。 My_unordered_set.h #pragma once #include"Hash.h" template<class K>//????? struct SetKeyOfT { K operator()(K key) { return key; } }; template<class K> class My_unordered_set

    27410编辑于 2025-11-15
  • 来自专栏杀马特

    哈希表模拟封装unordered_map和unordered_set

    前言: 首先我们要知道unordered_map和unordered_set的底层是用hash表实现的,也就是说它们底层成员就是一个哈希类的对象,完成了对它的封装,为两个关联容器,即以hash的模版,对应两者传模版参数完成调用工作 一·哈希表的调用: 这里我们采用的是链地址发来实现的hash表,也就说这是一个基本的模版hash表,但是我们不能直接用,因为如果是为了适应unordered_map和unordered_set,还需要有迭代器 <int> s; for (auto e : a) { s.insert(e); } unordered_set<int>::iterator it = s.begin(); while : 这里和上面封装的unordered_set很多一样,只不过是把getkeyoft是pair类型,取一下first即可: struct getkeyoft { const K& operator() 里面默认是hash class unordered_map { struct getkeyoft { const K& operator()(const pair<K, V>& kv)

    16600编辑于 2025-01-23
  • unordered_set 与unordered_multiset?我们该如何选择

    标准库早就为我们准备好了答案:std::unordered_set 和 std::unordered_multiset。 它们的底层是哈希表,能在大多数情况下把查找、插入、删除做到均摊 O(1)。 这就意味着: 相同数据量下,unordered_set 的内存占用往往比 set 还要大。 遍历时,内存访问是跳来跳去的,缓存友好度极差。 unordered_set 是离散节点,CPU 每次都要去不同的内存块取数据,缓存 miss 一大堆。 unordered_set 底层是哈希表,无序,不支持范围查询,但平均查找插入 O(1)。 如果你只关心“存不存在”,而不关心顺序,unordered_set 更好。 小结 如果把 unordered_set / unordered_multiset 总结成几条原则: 迭代器失效规则必须牢记,特别是 rehash。 key 不可修改,只能删了重插。

    15210编辑于 2025-10-22
  • 来自专栏羚羊角的特别专栏

    【C++】unordered_map和unordered_set的使用

    unordered就是无序的,unordered_map和unordered_set 是C++11之后才有的容器, 功能上和map/set基本相同,从底层看map和set是红黑树,unordered_map 和unordered_set底层是哈希表。 1.unordered_set系列 unordered_set和unordered_multiset参考⽂档:<unordered_set> - C++ Reference 1.1 unordered_set 类的介绍 unordered_set的声明如下。 2.unordered_map系列 unordered_map和unordered_multimap的相关文档:<unordered_map> - C++ Reference 前⾯部分我们已经学习了map

    48000编辑于 2025-06-25
  • 来自专栏c/c++

    【C++深度探索】unordered_set、unordered_map封装

    ,来对C++STL库中的unordered_set和unordered_map进行模拟实现。 ,unordered_map遍历无序 map有双向迭代器,unordered_map单向迭代器 它们之间性能有差异 unordered_map常见接口: 函数声明 功能介绍 unordered_map( begin 返回unordered_map第一个元素的迭代器 end 返回unordered_map最后一个元素下一个位置的迭代器 cbegin 返回unordered_map第一个元素的const迭代器 ✨unordered_set介绍 文档介绍,点击跳转   unordered_set与unordered_map类似,不同在于前者储存单个数据,后者储存键值对,这里就不过多介绍。 2. 和unordered_map封装   我们对于unordered_set和unordered_map封装需要各种新开一个头文件unordered_set.h和unordered_map.h来进行,并且都需要包含

    39810编辑于 2024-08-29
  • 来自专栏后端技术

    c++ unordered_map

    unordered_map key无法取得时的的默认值 int main() { unordered_map<string, string> m1; unordered_map<string , bool> m2; unordered_map<string, int> m3; cout << (m1["a"] == "") << endl; // output 1

    95220发布于 2019-05-25
  • unordered_map和unordered_set特性以及解决哈希冲突

    模拟实现 unordered_map 和 unordered_set 的要点分析 底层哈希表设计 unordered_map和unordered_set底层均依赖哈希表实现,区别在于存储的数据类型: unordered_set存储单个键值(键即值) unordered_map存储键值对(pair<Key, Value>) 核心设计要点: 桶数组:使用动态数组存储桶,每个桶为链表头指针(链地址法解决冲突 include"hash_bucket.h" namespace aaa { template<class K, class V, class Hash = HashFunc<K>> class unordered_map key); } private: hash_bucket::HashTable<K, pair<const K, V>, MapKeyOfT, Hash> _ht; }; } 总的来说,unordered_map 和unordered_set的模拟实现核心在于: 基于链地址法的哈希表设计,解决哈希冲突 仿函数处理键的哈希计算和相等性比较 动态扩容机制维持低负载因子,保证效率 针对 set 和 map 的存储特性设计差异化接口和迭代器

    11510编辑于 2025-12-30
  • 来自专栏C++

    C++进阶:(九)深度剖析unordered_map 与 unordered_set容器

    一、容器家族新成员:unordered_map 与 unordered_set 简介 1.1 为什么需要 unordered 系列容器? 在学习 unordered_map 和 unordered_set 之前,我们已经熟悉了 set 和 map 容器。 1.2 unordered_map 与 unordered_set 的核心定位 unordered_set:无序、不重复的元素集合,专注于元素的快速查找、插入和删除,适用于需要去重且无需有序遍历的场景( 2.4 unordered_multimap 与 unordered_multiset 除了基础的 unordered_map 和 unordered_set,STL 还提供了支持键冗余的版本 : #include <unordered_map> // for unordered_map、unordered_multimap #include <unordered_set> // for

    20810编辑于 2026-01-14
  • 来自专栏c语言,c++

    【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上传多一个模板参数,这样取模的仿函数就可以在外面传了。 (25); unordered_set<int>::iterator it = s.begin(); while (it !

    29710编辑于 2024-08-20
  • 来自专栏用户11956881的专栏

    【C++】封装哈希表模拟实现unordered_set和unordered_map

    也欢迎关注我的blog主页: 落羽的落羽 一、unordered_xxx系列容器介绍 我们之前学习过了STL中的map和set,它们的底层是红黑树实现的,增删查改的效率在O(n)。 除此之外,STL中还有unordered_map、unordered_multimap和unordered_set、unordered_multiset容器,它们的使用方式和map系列和set系列几乎一模一样 它们的主要区别在于,unordered_xxx系列容器的底层是由哈希表实现的,上一篇文章我们也详细介绍了哈希表,详见【C++】哈希表原理与实现详解。它们的增删查改的效率都在O(1),总体更优。 二、哈希表封装实现 用哈希表封装unordered_xxx系列容器,选择使用链地址法的哈希桶。实现的过程和之前模拟实现map和set也大体相似,详见【C++】论如何封装红黑树模拟实现set和map。 实现哈希表 封装unordered_map和unordered_set,实现KeyOfT 实现iterator和const_iterator unordered_map的operator[] 完整实现如下

    11810编辑于 2025-12-18
  • 来自专栏我的博客

    【C++】23. unordered_map和unordered_set的使用

    1. unordered_set系列的使用 1.1 unordered_set和unordered_multiset参考文档 https://legacy.cplusplus.com/reference /unordered_set/ 1.2 unordered_set类的详细介绍 • unordered_set的声明模板如下: template<class Key, class Hash 请参考以下代码演示的对比差异: #include<unordered_set> #include<unordered_map> #include<set> #include<iostream> using 系列的使用 2.1 unordered_set和unordered_multiset参考文档 https://legacy.cplusplus.com/reference/unordered_map/ 2.2 unordered_set与set的使用区别 • 查看STL文档我们会发现unordered_map和map都支持增删查改等基本操作,它们的接口设计几乎相同,包括insert()、erase()

    26310编辑于 2025-12-22
  • 来自专栏YIN_尹的博客

    【C++】unordered_map和unordered_set的使用 及 OJ练习

    本文中只对unordered_map和unordered_set进行介绍, unordered_multimap和unordered_multiset大家可自行查看文档介绍。 2. map、set系列容器和unordered_map、unordered_set系列容器的区别 首先我们来简单说一下前面学的不带unordered的几个容器和这篇文章学习的unordered系列的容器有什么区别 /unordered_multimap、unordered_set/unordered_multiset它们的底层是哈希表,至于什么是哈希表,大家有的可能听说过,有的可能没有,没关系,我们后面会讲。 4. set与unordered_set性能对比 那我这里呢也提供了一段代码,以set和unordered_set为例来测试对比一下它们的性能: 因为unordered系列和非unordered系列它们底层的数据结构都是一样的 思路分析 那这道题其实只用unordered_set也能搞: unordered_set虽然不能排序,但是也是可以去重的,首先我们先对两个数组进行去重。

    62510编辑于 2024-01-23
领券