不了解c ++ set的工作原理

时间:2019-07-04 08:51:15

标签: c++ set

我正在使用std::set类来解决leetcode问题。通过Googling,我了解到std::set使元素保持有序排列,并且听说set.begin()返回最小的元素。但是我也听说集合使用红黑树,并且具有O(log n)时间复杂度。我不明白这两个元素如何结合在一起,就像当红黑树不能保证最小元素将是head时,set.begin()如何返回最小元素。

此外,set.begin()函数使该容器似乎使用数组而不是链接列表来构建红黑树,这也是我不理解的。如何使用数组代替树?

2 个答案:

答案 0 :(得分:2)

在基础树中,最左边的节点是最小的节点,begin()是最左边的节点。

迭代以适当的顺序遍历树的节点。

例如,如果树是(这是一个更简单的“常规”二进制搜索树,但原理与红黑树相同)

     4
   /   \
  2     6
 /\    /
1  3  5

然后迭代将从1开始,然后向上移动到2,再向下移动到3,向上两步到4,向下两步到5,最后到6。
(这意味着遍历树的“步骤”不是固定时间的操作。)

答案 1 :(得分:0)

该标准未对任何容器强加特定的实现。红黑树是set可能实现。还可以自由选择如何使begin保持不变的复杂性。

假设实现选择一棵树,最明显的方法是保持指向最小元素以及树根的指针。

您可以使用数组实现有序集,例如boost::flat_set。这不能满足与std::set相同的复杂性要求。它仅通过插入已排序的位置,并且仅当不存在等效元素时才能做到这一点。