不了解C 集合的工作方式
Do not understand how c++ set works
我正在使用 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
相同的复杂性要求。它仅通过插入排序的位置来做到这一点,并且只有在没有等效元素的情况下才能做到这一点。
相关文章:
- 在 Eclipse 中添加库的工作方式是否与在 Visual Studio 中相同?
- OpenGL应用程序在不同的计算机上的工作方式不同
- 为什么我的代码在添加不相关的代码行后工作方式不同?
- wait_until在主线程而不是主线程中的工作方式不同吗? c ++
- 用于了解输入和输出流缓冲区实际工作方式的程序
- 查找函数在unordered_map中的工作方式是搜索键值
- 尝试使用 Qt 库中的 QPixmap 将图像拆分为多个块。关于他的复制方法的工作方式,我有什么不明白的吗?
- 容器类别在STL中的工作方式
- Unity 的 HLSL/Cg 预处理器工作方式错误?
- 无法让我了解 cin.get 和 cout 在这里的工作方式
- 不了解C 集合的工作方式
- 有人可以解释C 操作员=此处的工作方式
- 了解 declval 在copy_assignment情况下的工作方式
- 打开文件的正确模式是什么,以便 seekp() 的工作方式与在默认模式下打开的文件相同
- 了解文件页在技术级别的工作方式
- 战俘的工作方式不同,详细解释
- 切换到新编译器后,SSCANF 的工作方式有所不同
- 为什么三元运算符在编译时的工作方式与运行时不同?
- 对运算符删除覆盖的工作方式感到困惑
- 在两种情况下,铸造的工作方式不同