unordered_map 中的存储桶实施

implementation of bucket in unordered_map

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

该标准不强制执行任何特定的实现。

libstdc++和微软的实现只使用了链表(其他的实现我没有研究,所以这里只考虑这两个)。它们都使用一个包含所有桶的长链表(libstdc++ - 单链表,Microsoft - 双链表)。这允许在整个容器中快速迭代,并在迭代器 O(1).

上进行 operator++ 操作

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

libstdc++ 的示意图*:

Microsoft 的示意图*:

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