用C ++设置实现?

时间:2013-04-07 15:59:41

标签: c++ algorithm data-structures stl

根据以下链接--C ++的STL中的http://www.cplusplus.com/reference/set/set/集通常实现为二进制搜索树,我能够在诸如整数或字符集或浮点数或字符串的情况下衡量数据类型的行为就这一点而言,很容易看到BST排序强加于集合元素,但考虑到集合的二叉搜索树数据结构实现,我无法看到如何使用二叉搜索树实现以下数据类型:

  1. set<vector<int>>set<vector<string>>set<vector<double>>set<list<int>>
  2. set<map<int, int>>
  3. set<stack<int>>
  4. 或许多其他数据类型,如何为这些类型分配内存以及如何维护排序。

    此外,我无法弄清楚以下内容,每当将新的向量添加到集合中时,集合数据类型是否在内部检查集合中的所有向量的相似性或所有相似性的映射,这些都是我的事情我我无法搞清楚。如果有人可以帮助我想象这些概念,那就太好了。

    提前致谢:)

2 个答案:

答案 0 :(得分:1)

该集使用严格的弱排序来确定每个元素的位置。默认情况下,使用std::less<T>完成此操作。这将导致对operator<(const T&, const T&)的调用。现在,std::vector have such operators等容器只执行所有元素的lexicographical comparison。这就是std::set<std::vector<int>>可以开箱即用的方式。

插入新元素时,集合必须检查所有元素。插入是一种对数复杂度操作,这就是为什么实现往往是一个自平衡的二叉树(我用这个相当奇怪的因果关系表示它,因为C ++标准没有指定实现应该是什么样的,它应该如何表现。 )

答案 1 :(得分:0)

无论具体类型set<T>是什么,T始终都是一样的。在插入时,它通过使用std::less<T>(默认情况下调用operator<)将新元素与各种现有元素进行比较,找出树中 * 的位置。如果operator<没有为T重载,那么它将无法编译。

因此,从如何维护集合的细节中抽象出如何订购T实例的细节。

<小时/> *注意std::set不必使用树;这只是一个典型的实现。