在bits/stl_tree.h中_Rb_tree_increment的定义是什么?

Der*_* Tu 8 c++ algorithm stl

我想学习stl中红黑树的代码.我在文件bits/stl_tree.h中找到了一个名为_Rb_tree_increment的函数

它写道:

 143   _GLIBCXX_PURE _Rb_tree_node_base*
 144   _Rb_tree_increment(_Rb_tree_node_base* __x) throw ();
Run Code Online (Sandbox Code Playgroud)

但我找不到这个功能的定义.有人可以帮忙吗?

非常感谢你.

Mas*_*ssa 12

就像@Mike Seymour所说,我在库的源路径上找到了定义,更确切地说是在内部gcc-4.8.1/libstdc++-v3/src/c++98/tree.cc:

  static _Rb_tree_node_base*
  local_Rb_tree_increment(_Rb_tree_node_base* __x) throw ()
  {
    if (__x->_M_right != 0) 
      {
        __x = __x->_M_right;
        while (__x->_M_left != 0)
          __x = __x->_M_left;
      }
    else 
      {
        _Rb_tree_node_base* __y = __x->_M_parent;
        while (__x == __y->_M_right) 
          {
            __x = __y;
            __y = __y->_M_parent;
          }
        if (__x->_M_right != __y)
          __x = __y;
      }
    return __x;
  }

  _Rb_tree_node_base*
  _Rb_tree_increment(_Rb_tree_node_base* __x) throw ()
  {
    return local_Rb_tree_increment(__x);
  }

  const _Rb_tree_node_base*
  _Rb_tree_increment(const _Rb_tree_node_base* __x) throw ()
  {
    return local_Rb_tree_increment(const_cast<_Rb_tree_node_base*>(__x));
  }
Run Code Online (Sandbox Code Playgroud)

  • 看第二个“if”语句:“__x-&gt;_M_right”怎么可能等于“__y”(即它的祖父母)? (3认同)
  • @user2023370如果你查看相反函数_Rb_tree_decrement()的源代码,你实际上会在那里找到以下代码:`if (... __x-&gt;_M_parent-&gt;_M_parent == __x)`。所以是的,对于根,元素的祖父母可以是该元素本身。这可能是为了维护指向树的第一个和最后一个元素的特殊指针,以便“begin()”、“end”和“std::prev(end)”都是高效的,不需要筛选树分别查找第一个或最后一个元素。 (2认同)
  • @user2023370通过查看`_Rb_tree_insert_and_rebalance()`,我们可以看到,`__header._M_parent`实际上指的是根节点,而`__header._M_left`和`__header._M_right`指的是最左边的节点(=`begin()) `) 和最右边的节点 (= `std::prev(end())`) 分别。`__header()` 节点本身代表 `end()` 迭代器。您已经看到的特殊条件可能存在,因此“operator++”和“operator--”实际上不会超出开头/结尾。 (2认同)

Arn*_*rtz 3

该定义取决于您拥有的标准库。不同的编译器供应商为其编译器提供了标准库的不同实现。看来您找到了一个非模板函数。它应该在某些 cpp 中定义,并且将在 lib 文件中随编译器一起提供,因此您无法直接访问代码,因为它不会随您的编译器一起提供 - 这根本没有必要。

如果您的编译器是专有编译器,例如来自 Microsoft 或 Borland 的编译器,那么您将得到的就是这些。然而,如果您有 gcc,那么您很幸运:gcc 是开源的,您可以在线找到标准库的 gcc 实现的源代码。

  • OP 显然正在使用 GCC 附带的 stdlibc++ 实现。 (3认同)