不确定 unordered_map 是如何工作的

2024-03-19

我对 unordered_map 的工作原理、存储桶是什么以及如何管理它们有点困惑。

From 这篇博文 http://codeforces.com/blog/entry/21853, unordered_map 是向量的向量。

我的问题是:

  • 假设桶是“内部”向量是否正确?
  • 由于每个存储桶(向量)可以包含多个元素,由哈希表(“外部”向量)上的哈希冲突给出,并且由于我们必须扫描这个内部向量(以线性时间),因此假设我们是否正确必须在键类型上定义 equal 方法(除了哈希运算符之外)才能找到存储桶内的键?
  • 默认情况下外部向量(哈希表)大小是多少?
  • 默认情况下内部向量大小是多少?
  • 如果一个存储桶中的元素数量变得太大会发生什么?换句话说,当重新散列发生时会发生什么?

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


std::unordered_map http://en.cppreference.com/w/cpp/container/unordered_map是标准的C++哈希表 https://en.wikipedia.org/wiki/Hash_table。它曾经被称为hash_map https://www.sgi.com/tech/stl/hash_map.html在 STL 中,但是当 1998 年 STL 的许多接口被合并到 C++ 中时错过了机会,到 2011 年,很多库都有自己的 hash_map,C++ 不得不选择另一个名称(我认为“无序”是一个很好的选择;假设顺序哈希表中的内容是错误的常见来源)。

假设桶是“内部”向量是否正确?

不,它既不正确(与迭代器失效要求不兼容)又危险(在这种假设下,您最终可能会减去指向同一存储桶中元素的指针)。

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

  • LLVM libc++unordered_map is a unique_ptr 到数组 https://github.com/llvm-mirror/libcxx/blob/master/include/__hash_table#L946的链表的__哈希_节点 https://github.com/llvm-mirror/libcxx/blob/master/include/__hash_table#L70s
  • GNU libstdc++unordered_map is a 指向数组的指针 https://github.com/gcc-mirror/gcc/blob/master/libstdc%2B%2B-v3/include/bits/hashtable.h#L312的链表的_哈希_节点 https://github.com/gcc-mirror/gcc/blob/master/libstdc%2B%2B-v3/include/bits/hashtable_policy.h#L227s

假设我们必须在键类型上定义 equal 方法(除了哈希运算符)才能找到存储桶中的键,是否正确?

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

默认情况下外部向量(哈希表)大小是多少?

不存在“外部向量”。默认构造的桶数std::unordered_map is 实现定义的 http://en.cppreference.com/w/cpp/container/unordered_map/unordered_map,您可以使用以下方式查询桶数 http://en.cppreference.com/w/cpp/container/unordered_map/bucket_count.

默认情况下内部向量大小是多少?

不存在“内部向量”。任何给定存储桶的大小等于当前放置在存储桶中的元素数量。您可以使用以下方式查询桶大小 http://en.cppreference.com/w/cpp/container/unordered_map/bucket_size

如果一个存储桶中的元素数量变得太大会发生什么?换句话说,当重新散列发生时会发生什么?

如果元素数量达到,则不会发生任何事情one水桶变得太大。但是如果每个桶的平均元素数(又名负载系数 http://en.cppreference.com/w/cpp/container/unordered_map/load_factor) 超过最大负载系数 http://en.cppreference.com/w/cpp/container/unordered_map/max_load_factor,重新散列发生(例如insert http://en.cppreference.com/w/cpp/container/unordered_map/insert)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

不确定 unordered_map 是如何工作的 的相关文章

  • 为什么 PCRE 正则表达式比 C++11 正则表达式快得多

    一些示例代码 这是使用 cregex iterator 的 c 11 部分 std chrono steady clock time point begin0 std chrono steady clock now regex re
  • 更改 WinForms 按钮突出显示颜色

    I found 这一页 https stackoverflow com questions 9260303 how to change menu hover color winforms 其中概述了如何更改 MenuStrip 及其项目的呈
  • 在 C/C++ 中读取和写入二进制文件的中间部分

    如果我有一个大的二进制文件 假设它有 100 000 000 个浮点数 C 或 C 有没有办法打开文件并读取特定的浮点数 而不必将整个文件加载到内存中 即我如何快速找出第 62 821 214 个浮点是什么 第二个问题 有没有办法更改文件中
  • 改变 RGB 颜色的色调

    我正在尝试编写一个函数来改变 RGB 颜色的色调 具体来说 我在 iOS 应用程序中使用它 但数学是通用的 下图显示了 R G 和 B 值如何随色调变化 看起来 编写一个函数来改变色调似乎应该是一个相对简单的事情 而不需要对不同的颜色格式进
  • 如何从头开始重复C程序并清理屏幕和第一个输入值?

    我是编程新手 我写了一个简单的程序 我想一次又一次地重复该程序 并且只有当用户想要退出时它才能退出 这是我的程序 include
  • 我是否必须使用我的数据库训练 Viola-Jones 算法才能获得准确的结果?

    我尝试提取面部数据库的面部特征 但我认识到 Viola Jones 算法在两种情况下效果不佳 当我尝试单独检测眼睛时 当我尝试检测嘴巴时 运作不佳 检测图像的不同部分 例如眼睛或嘴巴 或者有时会检测到其中几个 这是不可能的情况 我使用的图像
  • DPI 图形屏幕分辨率像素 WinForm PrintPageEventArgs

    对于运行我的应用程序的任何显示器 Dpi 点与像素有何关系 int points Screen primary public Form1 InitializeComponent points 1 primary null void OnPa
  • 如何使用 PowerShell 使用 C# DLL 中存在的类的 New-Object

    例如 我有一个 C 类 public class MyComputer PSObject public string UserName get return userName set userName value private strin
  • 字符串中unicode字符的正则表达式

    我正在使用 C 进行一些 OCR 工作 并提取了我需要使用的文本 现在我需要使用正则表达式解析一行 string checkNum string routingNum string accountNum Regex regEx new Re
  • 无法运行bjam编译boost python教程

    我正在尝试跟随本教程 http www boost org doc libs 1 55 0 libs python doc tutorial doc html python hello html关于为 Windows 的 python 包装
  • C 中经过的时间

    include
  • 最好的 C++ 编译器是哪个? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何存储将被多个不同类访问的字符串常量? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 关于堆栈溢出有太多不同的答案 声明一个命名空间 并在 hpp 文件中将所有字符串标记为 extern const 并在 cpp 文件中放置它们的
  • 最佳实践:从属性中抛出异常

    什么时候适合从属性 getter 或 setter 中抛出异常 什么时候不合适呢 为什么 关于这个主题的外部文档的链接会很有帮助 谷歌搜索结果出奇的少 Microsoft 在以下位置提供了有关如何设计属性的建议 http msdn micr
  • STL(标准模板库)中使用的设计模式

    我正在学习STL和设计模式 我想知道是否有任何文档或链接可以解释如何在 STL 中实现设计模式 我做了谷歌但无法获得太多数据 我希望你的意思是 哪些设计模式可以在STL中识别 STL 堆栈是一个容器适配器 适配器是一种设计模式 迭代器也是一
  • C memcpy 二维数组

    我正在尝试使用将一个二维数组复制到另一个memcpy 我的代码 include
  • 如何使用 Xamarin 应用程序开发自动注销

    我必须在 App xaml cs 上添加功能才能使其正常工作 我在 OnStart 上添加了功能 但现在它会间歇性地一次又一次地将我从应用程序中注销 根据下面的代码 我需要做什么才能让它停止这样做 或者我的代码有问题 这是我最新的代码 na
  • 为什么 `boost::any` 比 `void*` 更好?

    有什么先天优势boost any and boost any cast提供超过使用void and dynamic cast 优点是boost any比类型安全得多void E g int i 5 void p i static cast
  • 如何包装实体框架以在执行前拦截 LINQ 表达式?

    我想在执行之前重写 LINQ 表达式的某些部分 我在将重写器注入正确的位置时遇到问题 实际上根本没有 查看实体框架源代码 在反射器中 它最终归结为IQueryProvider Execute在 EF 中 它通过以下方式耦合到表达式Objec
  • win32 内容已更改,但除非移动窗口,否则不会显示更新

    我的 win32 GUI 内容每秒都会更改 但除非手动移动窗口 否则不会显示更新 我尝试每秒弹出一个消息框来触发窗口刷新 它成功了 因此 这证明我的内容确实发生了变化 但窗口没有更新 我希望刷新窗口而不是每次都弹出消息框 有没有这样的窗口功

随机推荐