-
Notifications
You must be signed in to change notification settings - Fork 626
Open
Description
您好,我正在编写 Js 模式下的类 STL 容器库 js-sdsl
对于 STL RB-Tree 中的 decrement 函数(迭代器的前移函数)存在一个疑问
当我向 Tree 中从小到大插入两个不同的值后,我会得到以下结构的 RB-Tree:
其中 Root 节点和 Header 节点互为父子,Header 节点的左右节点分别指向插入的两个值,并且小的那个值会成为 Root 节点,大的会成为 Root 的右子节点
此时,当对指向 Root 节点的迭代器进行前移操作(decrement),会经过如下步骤:
- 判断当前不为 Header 节点,进行步骤 2
- 判断当前指针的左子节点为空,执行步骤 3
- 判断当前节点(Root)为父节点(Header)的左子节点(注意,此时 Header 的 LeftMost 指向树中最小节点,即 Root),于是将指针移至父节点(Header),重复步骤 3 直到不满足条件,执行步骤 4
- 显然由于 Root 节点和 Header 节点互为父子,最终经过步骤 3 指针重新指向 Root 节点
最终如下代码理应陷入死循环:
set<int> st { 1, 2 };
for (auto it = st.rbegin(); it != st.rend(); ++it) {
cout << *it <<endl;
}但实际上,上述代码能够正常运行,对此我感到很疑惑,我并没有看到 STL 代码中有任何特殊的处理,我对于 C++ 并不精通,请问 @arkingc 您能够帮助我理解这个问题吗?
感激不尽!
Metadata
Metadata
Assignees
Labels
No labels
