不了解C 集合的工作方式

Do not understand how c++ set works

本文关键字:工作 方式 集合 不了解      更新时间:2023-10-16

我正在使用 std::set类用于leetcode问题。从谷歌搜索中,我了解到std::set以有序的方式保留元素,我听说set.begin()返回最小的元素。但是我还听到SET使用红色树木,并且具有O(log n(时间复杂性。我不明白这两个如何一起进行,因为当红色树不保证最小的元素将是头时,set.begin()如何返回最小的元素。

set.begin()函数也使该容器似乎使用数组而不是链接列表来构建Redblack树,我再也听不懂。如何使用数组代替树?

在下面的树中,最左的节点是最小的,而 begin()是最左边的节点。

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

例如,如果树是(这是一个更简单的"常规"二进制搜索树,但是红色树的原理是相同的(

     4
   /   
  2     6
 /    /
1  3  5

然后,迭代将从1开始,然后升至2,再次向下移至3,向3步,向4步,向4下,向5步至5,最后达到6。
(这意味着在树上迭代时的"步骤"不是恒定的时间操作。(

标准不会为任何容器施加特定的实现。红黑树是可能的 set的实现。也可以免费选择如何使begin恒定复杂性。

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

您可以实现带有数组的有序集,例如boost::flat_set。这不符合与std::set相同的复杂性要求。它仅通过插入排序的位置来做到这一点,并且只有在没有等效元素的情况下才能做到这一点。