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>
。
我在某处看到,一旦一个桶中的元素超过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>
。