【问题标题】:implementation of bucket in unordered_mapunordered_map 中桶的实现
【发布时间】:2021-07-29 19:32:57
【问题描述】:

我在某处读到,一旦一个桶包含超过 8 个元素,它将变成一个红黑树而不是链表。我知道 java 使用这个策略,但我确定 c++

【问题讨论】:

    标签: c++ unordered-map bucket


    【解决方案1】:

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

    在 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 对象旁边但未在此处的图形中描绘?
    • @JeremyFriesner 是的,对不起。前段时间我为std::unordered_set 制作了这些图表。对于std::unordered_map,键是键值对。我在答案中添加了评论。
    猜你喜欢
    • 2017-07-20
    • 1970-01-01
    • 2011-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多