unordered_map中bucket的实现

Eli*_*lin 1 c++ unordered-map bucket

我在某处读到,一旦一个桶容纳了超过 8 个元素,它就会变成一棵红黑树,而不是一个链表。我知道 java 使用此策略,但我确定 c++

Evg*_*Evg 7

该标准不强制要求任何特定的实施。

libstdc++ 和 Microsoft 实现中仅使用链表(我没有研究其他实现,所以这里我只考虑这两个)。它们都使用一个长链表(libstdc++ - 单链表,Microsoft - 双链表)来保存所有存储桶。这允许快速迭代整个容器并对operator++迭代器进行操作O(1)

libstdc++ 中的存储桶数组保存指向第一个存储桶元素之前的一个元素的指针(因为它是单链表)。在 Microsoft 实现中,存储桶数组包含成对的迭代器 - 指向第一个存储桶元素和最后一个存储桶元素之后的迭代器。

libstdc++ 的示意图*:

libstdc++ 中的 unordered_set

Microsoft 的示意图*:

Microsoft STL 中的 unordered_set

* 两个图均对应于std::unordered_set<Key>. 对于std::unordered_map<Key, Value>,key应替换为std::pair<Key, Value>.