std :: set和std :: map有什么区别

时间:2014-02-15 21:49:34

标签: c++ map set binary-search-tree

我对c ++编程比较陌生,想知道是否有人可以帮我澄清一些问题。

http://www.cplusplus.com/reference/set/set/

http://www.cplusplus.com/reference/map/map/

我一直在阅读如何实现STL二进制搜索树,并且我一直注意到std :: set和std :: map经常被提到作为完成这样一个任务的方法。然而,这两者究竟有什么区别?对我来说,两者看起来几乎完全相同,我不确定是否有一些我没有注意到的东西,使一个人比另一个更好的特定任务。使用std :: set over std :: map来实现从数组或向量中获取值的STL二进制搜索树(例如速度)是否有任何优势?

如果有人能帮我理解这个概念,我会非常感激!

1 个答案:

答案 0 :(得分:7)

std::setstd::map都是associative containers。区别在于std::sets仅包含密钥,
 在std::map中有一个关联值,即如果A -> B,则地图[A] = B,这就像hashing但不是O(1),而是{{1} }}。

您可以进一步查看在O(log N)时间内提供操作的unordered_map

O(1)以分类格式保存数据 两者的实现都是通过平衡树(如AVL或红黑树)完成的,这会给std::set时间复杂度。

但值得注意的是,两者都可以存储唯一值。要解决这个问题,您还必须看到multimapmultiset

希望这有帮助!

更新:在红黑树重新平衡旋转的情况下,O(logN)操作是O(1),而使用AVL这是O(log n)操作,使得红黑树在重新平衡阶段的这个方面更有效,并且是更常用的可能原因之一。