【发布时间】:2021-07-29 19:32:57
【问题描述】:
我在某处读到,一旦一个桶包含超过 8 个元素,它将变成一个红黑树而不是链表。我知道 java 使用这个策略,但我确定 c++
【问题讨论】:
标签: c++ unordered-map bucket
我在某处读到,一旦一个桶包含超过 8 个元素,它将变成一个红黑树而不是链表。我知道 java 使用这个策略,但我确定 c++
【问题讨论】:
标签: c++ unordered-map bucket
该标准不要求任何特定的实施。
在 libstdc++ 和 Microsoft 实现中只使用链表(我没有研究其他实现,所以这里我只考虑这两个)。它们都使用一个包含所有存储桶的长链表(libstdc++ - 单链表,Microsoft - 双链表)。这允许对整个容器进行快速迭代,并对迭代器 O(1) 进行 operator++ 操作。
libstdc++ 中的桶数组在第一个桶元素之前保存指向一个元素的指针(因为它是一个单链表)。在 Microsoft 实现中,bucket 数组包含一对迭代器 - 到第一个 bucket 元素和最后一个之后的那个。
libstdc++ 的示意图*:
Microsoft 的示意图*:
* 两个图都对应std::unordered_set<Key>。对于std::unordered_map<Key, Value>,key 应替换为std::pair<Key, Value>。
【讨论】:
value 对象是否存储在 key 对象旁边但未在此处的图形中描绘?
std::unordered_set 制作了这些图表。对于std::unordered_map,键是键值对。我在答案中添加了评论。