ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

c – 不确定unordered_map的工作原理

2019-07-27 16:08:41  阅读:239  来源: 互联网

标签:unordered-map c


我有点困惑,unordered_map是如何工作的,什么是桶以及如何管理它们.

this blog post开始,unordered_map是向量的向量.

我的问题是:

>假设桶是“内部”向量是正确的吗?
>因为每个桶(向量)可以包含多个元素,由哈希表上的哈希冲突(“外部”向量)给出,并且因为我们必须扫描这个内部向量(在线性时间内),所以假设我们必须在密钥类型上定义相等的方法(对哈希运算符成瘾)才能找到桶内的密钥?
>默认情况下外部向量(哈希表)大小是多少?
>默认情况下内部矢量大小是多少?
>如果一个桶中的元素数量变得太大会发生什么呢?换句话说,重新发生时会发生什么?

很抱歉这些问题,但我没有找到任何详细解释这个结构如何工作(例如在cppreference.com上).

解决方法:

std::unordered_map是标准的C hash table.它曾经在STL中被称为hash_map,但在1998年许多STL的接口被合并到C时错过了船,到2011年,很多图书馆都有自己的hash_map,C必须选择另一个名字(我认为“无序”是一个很好的选择;假设哈希表中的顺序是错误的常见来源).

is it correct to assume that the buckets are the “internal” vectors?

不,它都是不正确的(与迭代器无效要求不兼容)和危险(在这个假设下你最终可能会减去指向同一个桶中元素的指针).

在现实生活中,桶是链表;例如

> LLVM libc unordered_map是__hash_node的链接列表的unique_ptr to an array
> GNU libstdc unordered_map是_Hash_node的链接列表的pointer to an array

is it correct to assume that we have to define the equal method on the key type (in addiction to the hash operator) in order to find the key inside the bucket?

是的,在桶中定位密钥正是std :: unordered_map的第4个模板参数所针对的(当然,不需要在字面上调用“密钥类型上的相等方法”)

what is the external vector (hash table) size by default?

没有“外部载体”.默认构造的std :: unordered_map的桶数为implementation-defined,您可以使用bucket_count进行查询.

what is the internal vector size by default?

没有“内部载体”.任何给定存储桶的大小等于当前放置在存储桶中的元素数.您可以使用bucket_size查询它

what happens if the number of elements in one bucket becomes too big?bor in other words, when the rehash happens?

如果一个桶中的元素数量变得太大,则没有任何反应.但如果每个桶的平均元素数量(即load_factor)超过max_load_factor,则重新发生(例如insert)

标签:unordered-map,c
来源: https://codeday.me/bug/20190727/1555332.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有