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

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

网上原因好像说是 STL 加入标准C++之时,hash_map系列当时还没有完全实现,所以很多平台上虽然安装了 g++ 编译,但不一定有 hash_map 实现。...别名为成员类型 unordered_map::allocator_type 在 unordered_map 成员函数参考中,模板函数假定了相同名称:Key, T, Hash, Pred, Alloc...桶中单个元素可以通过 unordered_map::begin unordered_map::end 返回范围迭代进行访问。...三、map, hash_map, unordered_map 区别 参考网址: 《c++中map与unordered_map区别》 《C++中maphash_map区别》 1....,故红黑树效率决定了map效率,map只需要提供比较函数(一般为小于函数)即可完成比较; hash_maphash_map 需要提供 hash 函数,以及等于函数; unordered_map

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

C++11:基于std::unordered_map共享锁构建线程安全map

所以在实现线程安全map时,我没有选择使用std::mutex控制所有的操作为独占访问,而是用RWLock来控制map对象访问,RWLock是我以前自己写一个类,将线程对资源访问分为读取操作和写入操作两类...{ private: std::unordered_map map; // 用于控制读写访问锁对象 mutable RWLock..._ */ 说明: 因为RWLock禁止复制构造函数赋值操作符,所以threadsafe_unordered_map也禁止复制构造函数赋值操作符。...另外在类中增加几个用于多线程环境函数(见源码中中文注释), 当你需要对map加锁时需要用到raii write_guard()noexceptraii read_guard()const noexcept...const则用于多线程环境查找__x对应值。

8.6K10

【视频+文字讲解】C++那些事之彻底搞懂STL HashTable

_Value:关联容器中值类型。 _Alloc:用于内存分配分配器类型。 _ExtractKey:从键值对中提取键函数对象类型。 _Equal:判断键是否相等函数对象类型。...iterator(__p) : end(); } 首先,通过调用 _M_hash_code 方法计算键哈希码 __code。哈希码是根据键值计算得到用于确定键在哈希表中存储位置。...该方法会遍历桶中节点,并根据节点哈希码与目标键进行比较,找到匹配节点。 如果找到了匹配节点,就创建一个迭代 iterator,指向该节点,并返回该迭代。...接着,函数计算 __min_bkts,即根据当前元素数量负载因子 _M_max_load_factor 估计最小所需桶数量。...函数直接返回 std::make_pair(false, 0),表示不需要重新散列。 所以,我们知道了扩容桶规则是什么了。

21020

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

拓展:有的同学可能会疑惑为什么底层为哈希表 unordered 系列容器为什么要取名为 unordered_map unordered_set,而不是取名为更加形象 hashmap hashset...- C++ Reference (cplusplus.com) 构造 在学习了上一节 哈希 之后,相信大家对于 unordered_map 构造函数 Hash Pred 就不会感到困惑了...,而其他自定义类型 HashFunc 比如 People、Date 则需要我们自己提供仿函数并显式传递给 unordered_map; 而 Pred 则是我们模拟实现中另一个仿函数 KeyOfT,它作用是返回...,一个用于获取最大平衡因子,一个用于设置最大平衡因子,即用户可以通过 max_load_factor 函数根据自己业务场景来设定最大平衡因子;其中 unordered_map默认最大平衡因子也是...}; 可以看到,在哈希表迭代中,我们没有通过增加模板参数 Ref Ptr 来解决 const 迭代问题,而是为 const 迭代单独定义了一个 __HashTableConstIterator

1.3K30

Java-集合

如果希望再次遍历,需要重置我们迭代 iterator = col.iterator(); System.out.println("===第二次遍历===");...HashSet 执行添加元素流程,就能知道为什么 HashSet 能保证元素不重复了?...特点 Map 用于保存具有映射关系数据:Key-Value(双列元素) Map key value 可以是任何引用类型数据,会封装到HashMap$Node 对象中 Map key...// 如果table索引位置keyhashkeyhash值相同, // 并满足(table现有的结点key准备添加key是同一个对象||equals 返回真) // 就认为不能加入新...类型对象 m,键(String) 值(int) 分别用于存储员工姓名工资,存入数据如下: jack-650元; tom-1200元; smith-2900元; 2)将jack工资更改为2600

1.2K20

Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day19】—— 集合框架3

而ConcurrentHashMap也是最常用并发场景下Map选择,相信面试官对其理论实战知识也是在熟悉不过,因此如果不能深入了解,或许会轻易被问住。...,并没有做任何事,这里后面会讲到,这也是其他集合类有区别的地方,初始化操作并不是在构造函数实现,而是在put操作中实现,当然ConcurrentHashMap还提供了其他构造函数,有指定容量大小或者指定负载因子...,对当前table进行无条件自循环直到put成功,可以分成以下六步流程来概述: 如果没有初始化就先调用initTable()方法来进行初始化过程 如果没有hash冲突就直接CAS插入 如果还在进行扩容操作就先进行扩容...JDK1.8 —— get操作   我们现在要回到开始例子中,我们对个人信息进行了新增之后,我们要获取所新增信息,使用 String name = map.get(“name”) 获取新增 name...我们知道Hashtable是synchronized,但是ConcurrentHashMap同步性能更好,因为它仅仅根据同步级别对map一部分进行上锁。

27410

​让我们来看看,多线程下Map是如何实现线程安全

多线程下Map集合 前语 上一篇文章>是在大考周前写有关HashMap文章,在其开头开头提到过ConcurrentHashMapHashTable,因为既然讲到了Map那么就绕不开...HashTable不允许keyvalue为NULL。 为什么HashTablekey-value不能为NULL?...在源码注释中有这样一句话: 大致意思是要从Hashtable成功存储检索对象,用作键key对象必须实现hashCode方法equals方法,显然我们NULL是不具备这两个方法。...在单线程情况下我们当然可以通过调用map.containsKey(key)来确定key是否存在,而在多线程情况下,为了保证containsget操作原子性,显然这种做法在多线程情况下我们是无法使用...那么让我们来看看它源码: 通过翻阅源码我们可以看出,在我们调用Collections.synchronizedMap(Map)方法后,它将返回一个名为SynchronizedMap内部类。

41610

Java并发——ConcurrentHashMap

第一种是最简单,空着位置代表当前还没有元素来填充。...第二种就是 HashMap 非常类似的拉链法结构,在每一个槽中会首先填入第一个节点,但是后续如果计算出相同 Hash 值,就用链表形式往后进行延伸。...而当桶中节点数由于移除或者 resize 变少后,又会变回普通链表形式,以便节省空间体现了时间空间平衡思想,最开始使用链表时候,空间占用是比较少,而且由于链表短,所以查询时间也没有太大问题...这是一个小于千万分之一概率,通常我们 Map 里面是不会存储这么多数据,所以通常情况下,并不会发生从链表向红黑树转换事实上,链表长度超过 8 就转为红黑树设计,更多是为了防止用户自己实现了不好哈希算法时导致链表过长...为什么3.3 ConcurrentHashMapJava7 Java8对比1、数据结构Java7 Segment 分段锁 数组+链表Java8 数组 + 链表 + 红黑树2、并发度Java 7

18810

C++11 元编程 判断是否有std::hash特例并提供hash函数通用实现

用于向标准库提供返回数据类型T哈希值(hash value)哈希函数(hash function)。...比如,如果你要使用上面的自定义类型struct S作为std::unorderd_mapkey,就必须为模板类提供Hash参数,也就是提供keyhash函数。...已经提供了stringstd::hash特例化实现 std::unordered_map map; hash函数通用实现 有时在项目中有多个自定义类型需要提供std...那么可以考虑提供一个hash函数通用实现,并在编译期通过模板函数自动判断类型是否有std::hash特例实现,如果有就使用T自己特例化实现,如果没有就使用通用hash函数实现,下面是实现代码...Hash参数 std::unordered_map map_s; //TT没有std::hash实现,将hash_fn计算结果作为Hash参数,

4.1K10

Java面试题:HashMap为什么线程不安全、ConcurrentHashMap原理、ConcurrentHashMap与HashMap区别、Map总结

如果忘记可以到这里重新温习:Java面试题:ArrayList底层实现原理、HashMap实现原理、HashMapjdk1.7jdk1.8有什么区别1.HashMap 为什么线程不安全1.1 概述...假设两个线程A、B都在进行put操作,并且hash函数计算出插入下标是相同,当线程A执行完第6行代码后由于时间片耗尽导致被挂起,而线程B得到时间片后在该下标处插入了元素,完成了正常插入;然后线程A...ConcurrentHashMapget()方法没有加synchronized锁,为什么可以不加锁?因为table有volatile关键字修饰,保证每次获取值都是最新。...当我们往HashMap中put元素时,利用keyhashCode重新hash计算出当前对象元素在数组中下标存储时,如果出现hash值相同key,此时有两种情况。...我们可以举个反例,在 Java 原生数据结构中,也存在使用开放地址法散列表 —— 就是 ThreadlLocal。

5510

Java集合类原理实现

4.Set接口 插入无序 元素不能重复 底层均为Map集合实现 4.1 TreeSet类 先来瞅一眼这个类继承关系吧 实现了AbstractSet拥有了Set属性方法 实现了NavigableSet...如HashMap负载因子初始化为0.75.保证了两者之间权衡。 Hash表如何存储数据?Hash每一次存储都会先调用一个Hash函数,而这个Hash函数最后运算值就是所存储数据下标。...即当需要查询数据时候,仅仅只需要调用Hash函数进行一次计算就可以得出该数据所在下标。...内部Node数组并没有实例化。...确定key以后,需要判断该index下有没有值,如果有,判断新增这个元素与现有这个元素是否相同,如果相同,替换该值;如果不相同,遍历这个链表,判断这个链表中是否存在新增元素相同值,如果不存在则直接添加到链表尾部

86510

ConcurrentHashMap源码学习

private transient volatile int cellsBusy; //表计数,如果不为空,则大小为2次幂 //用于并发时,统计hash表中数组大小采用cas扩容大小: //...MAXIMUM_CAPACITY : tableSizeFor((int)size); this.sizeCtl = cap; } //构造函数map public ConcurrentHashMap...2.进行高位运算,消除符号带来影响,由于符号是进行扩容操作 3.进行自旋,如果table为空或者map为空,进行初始化 4.进行初始化hash过程中,initTable里面写得非常好,采用首先进行...7.如果一次遍历完成,则整个map元素迁移完成,此时会记下新tablesizeCtl值,方便下次扩容使用。 8.synchronized中锁定f,进行链表红黑树操作。...DEFAULT_CONCURRENCY_LEVEL:默认并发级别,这个是16,分度锁初始化容量是一样,同时初始化数组长度是一样,这样做目前是尽可能是请求处理均匀分布在hash表中。

50220

java核心数据结构总结

Map接口   围绕着Map接口,最主要实现类有:HashMap、hashTable、LinkedHashMapTreeMap。在HashMap子类中还有Properties类实现。   ...1、HashMapHashtable   首先说一下,HashMapHashtable区别:Hashtable大部分方法都实现了同步,而HashMap没有。因此,HashMap不是线程安全。...第三是内部算法不同,它们对keyhash算法hash值到内存索引映射算法不同。   HashMap就是将key做hash算法,然后将hash值映射到内存地址,直接取得key所对应数据。...HashMap中不得不提就是hash冲突,需要存放到HashMap中元素1元素2经过hash计算,发现对应内存地址一样。如下图: ?   ...hash()方法实现够好,就能尽可能减少冲突,那么对HashMap操作就等价于对数组随机访问操作,具有很好性能。

40220

消灭假新闻:使用Scikit-Learn检测虚假新闻

创建向量化程序分类 现在已经有了自己训练测试数据集,你就可以创建自己分类。...(有关多项式分布更多阅读,以及为什么最好使用整数,请查看 UPenn统计学课程中简洁说明)。...我们将使用假新闻数据集测试这个方法(它有显著速度优势永久学习劣势)。...在StackOverflow上有一个非常有用函数,可以用来寻找最能影响标签向量。它只适用于二进制分类(带有两个类分类),但这对你来说是个好消息,因为你只有假或真的标签。...结论 假新闻分类实验成功了吗?当然没有。 但是确实可以用一个新数据集,测试一些NLP分类模型,然后反思它们有多成功,是吗?是的。

3.1K50

Java集合容器面试题(2020最新版)

Map没有继承于Collection接口,从Map集合中检索元素时,只要给出键对象,就会返回对应值对象。...Iterator 接口提供遍历任何 Collection 接口。我们可以从一个 Collection 中使用迭代方法来获取迭代实例。...,所以我们还需要对hashCode作一定优化 hash()函数 上面提到问题,主要是因为如果使用hashCode取余,那么相当于参与运算只有hashCode低位,高位是没有起到任何作用,所以我们思路就是让...hashCode取值出高位也参与运算,进一步降低hash碰撞概率,使得数据分布更平均,我们把这样操作称为扰动,在JDK 1.8中hash()函数如下: static final int hash...通过上面的链地址法(使用散列表)扰动函数我们成功让我们数据分布更平均,哈希碰撞减少,但是当我们HashMap中存在大量数据时,加入我们某个bucket下对应链表有n个元素,那么遍历时间复杂度就为

1.2K20

10分钟掌握ConcurrentHashMap 3分钟清楚HashMap、Hashtable区别

ConcurrentHashMap继承AbstractMap接口,这个HashMap一样,然后实现了ConcurrentMap接口,这个HashMap不一样,HashMap是直接实现Map接口。...其他4个构造函数参数HashMap一样,而具体初始化过程却又不相同,HashMapHashtable传入容量大小负载因子都是为了计算出初始阈值(threshold),而ConcurrentHashMap...传入容量大小负载因子是为了计算出sizeCtl用于初始化table,这个sizeCtl即table数组大小,不同构造函数计算sizeCtl方法都不一样。...this.sizeCtl = cap; } //包含指定Map构造函数。 //置sizeCtl为默认容量大小 即16。 public ConcurrentHashMap(Map<?...,这个就是ConcurrentHashMap为什么高效原因之一。

8.1K100
领券