在C ++中,map基于黑红树,因此插入/删除功能将花费O(logn),而hash_map则基于哈希。
但是我在徘徊,基于什么数据结构设置?
Set按地图排序,因此,是否也基于黑红树设置?
它的键和值如何存储在该树中?
如果是这样,unorder_set的数据结构是什么?谢谢!
答案 0 :(得分:19)
无法保证。标准要求的唯一内容是操作成本,因此实现者可以自由使用他们想要的任何数据结构。通常std::set
和std::map
是平衡二叉树。
此外,std::unordered_set
和std::unordered_map
是哈希表。我相信这实际上是由标准保证的,因为你可以手动指定散列函数。
答案 1 :(得分:9)
set
和map
类型可以实现,但只要它符合C ++规范的时间复杂度要求,它将时间复杂性建立在平衡的二进制上搜索树的时间复杂性。虽然红色/黑色树木在map
和set
中很常见,但它们并不是唯一的选择。您可以使用AVL树,B树,AA树等实现它们。
希望这有帮助!
答案 2 :(得分:7)
有序关联容器,即std::set<...>
和std::map<...>
及其“多”版本,是基于节点的,具有最坏情况O(ln n)
复杂度。这意味着使用了平衡树。除了复杂性之外,当树变异时,指针和迭代器都不会失效(当然,除了erase()
d个对象的指针或迭代器之外)。
B-tree遗憾地没有正确的迭代器失效属性(并且对于映射需要重复存储密钥以获得大部分优势,因为使用std::pair<Key, Value>
强制表示)。在实践中,似乎红/黑树最有效,但还有其他可能的平衡策略,例如AVL树。跳过列表也可能具有必要的属性。在任何一种情况下,标准都没有强制要求确切的实施策略。
答案 3 :(得分:1)
正如其他人所说,似乎并不能保证标准中的具体实施。但是,标准确实会产生某些性能保证,例如在集合的O(log n)时间内插入,这似乎是您要问的真正问题。