Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

关于 RB-Tree 迭代器的疑惑 #9

Open
ZLY201 opened this issue Jun 15, 2023 · 2 comments
Open

关于 RB-Tree 迭代器的疑惑 #9

ZLY201 opened this issue Jun 15, 2023 · 2 comments

Comments

@ZLY201
Copy link

ZLY201 commented Jun 15, 2023

您好,我正在编写 Js 模式下的类 STL 容器库 js-sdsl

对于 STL RB-Tree 中的 decrement 函数(迭代器的前移函数)存在一个疑问

当我向 Tree 中从小到大插入两个不同的值后,我会得到以下结构的 RB-Tree:

抽象图

其中 Root 节点和 Header 节点互为父子,Header 节点的左右节点分别指向插入的两个值,并且小的那个值会成为 Root 节点,大的会成为 Root 的右子节点

此时,当对指向 Root 节点的迭代器进行前移操作(decrement),会经过如下步骤:

  1. 判断当前不为 Header 节点,进行步骤 2
  2. 判断当前指针的左子节点为空,执行步骤 3
  3. 判断当前节点(Root)为父节点(Header)的左子节点(注意,此时 Header 的 LeftMost 指向树中最小节点,即 Root),于是将指针移至父节点(Header),重复步骤 3 直到不满足条件,执行步骤 4
  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 您能够帮助我理解这个问题吗?

感激不尽!

@ZLY201
Copy link
Author

ZLY201 commented Jun 15, 2023

顺带一提,您的文档对于我的编写起到了很大作用,再次表示感谢!

@arkingc
Copy link
Owner

arkingc commented Jun 16, 2023 via email

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants