std::map 的底层结构是啥? [关闭]

Posted

技术标签:

【中文标题】std::map 的底层结构是啥? [关闭]【英文标题】:What is the underlying structure of an std::map? [closed]std::map 的底层结构是什么? [关闭] 【发布时间】:2017-02-16 12:19:55 【问题描述】:

昨天有人告诉我,有序映射的底层结构是二叉搜索树。这对我来说没有意义,因为如果是这种情况,您将无法进行 O(1) 检索。谁能解释一下?

另外,如果要在 C++ 中实现哈希表而不使用标准库,那么最好的方法是什么?

【问题讨论】:

你从哪里得知检索是 O(1)?首先阅读docs,其次它们通常被实现为red-black trees,第三你的其他问题太宽泛了 也尽量限制自己一个问题。 【参考方案1】:

std::map 查找时间不是 O(1),而是 O(log(n))。

std::unordered_map 的查找时间为 O(1) 摊销。

std::unordered_map 和 std::unordered_set 是哈希表。

【讨论】:

【参考方案2】:

    底层数据结构是实现定义的。它最常被实现为红黑树,它是一种自平衡二叉搜索树。获取元素的时间复杂度为 O(logn)(见this)

    我只想阅读std::unordered_map 的实现作为起点。我认为这是学习活动,因此阅读和理解工作中的 STL 实现将是一个很好的练习。如果不是练习,请使用std::unordered_map

【讨论】:

【参考方案3】:

std::map 使用红黑树,因为它在节点插入/删除和搜索的复杂性之间进行了合理的权衡。

【讨论】:

当前的实现确实如此,但标准并不要求它。 (目前没有人知道另一种可以满足要求的数据结构 - 但明天可能会发现。)

以上是关于std::map 的底层结构是啥? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

具有结构错误值的 std::map

如何初始化名为 params 的结构字段 std::map<std::string, std::string>

如何使用 std::map 将 bool 映射到 3d 点结构?

带有键的 std::map 作为具有三个 int 成员的结构 [重复]

std::map使用结构体自定义键值

基础结构体重载,用 char*作为std::map中的key