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 的底层结构是啥? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
如何初始化名为 params 的结构字段 std::map<std::string, std::string>
如何使用 std::map 将 bool 映射到 3d 点结构?