GCC stl_tree.h std :: set的红黑树源代码

时间:2014-06-07 00:01:42

标签: c++ gcc set std red-black-tree

我正在查看以下GCC源代码文件stl_tree.h:

https://gcc.gnu.org/onlinedocs/libstdc++/libstdc++-html-USERS-4.1/stl__tree_8h-source.html

特别是这一部分:

struct _Rb_tree_impl : public _Node_allocator
        {
      _Key_compare      _M_key_compare;
      _Rb_tree_node_base    _M_header;
      size_type         _M_node_count; // Keeps track of size of tree.

我正在尝试找出_Rb_tree_impl对象所拥有的数据成员 - 我的意思是它可能从_Node_allocator继承的数据成员。

在第330行,它将_Node_allocator定义为:

typedef typename _Alloc::template rebind<_Rb_tree_node<_Val> >::other _Node_allocator;

我不知道如何找到此类型的定义来检查它包含哪些数据成员。有人可以帮忙吗?这个类/结构位于何处?

1 个答案:

答案 0 :(得分:4)

分配器是无状态的,因此它不包含任何字段。 impl类的目的是通过使用基类布局优化不会为分配器花费任何空间。

天真的实施会浪费空间:

template <typename T, typename Alloc>
class NaiveContainer
{
    Node<T*> root;     // just for exposition
    Alloc alloc;

public:
    NaiveContainer(Alloc const & a = Alloc()) : alloc(a) {}
    Alloc get_alloc() const { return alloc; }
    // ...
};

这个类严格地比它需要的大。因此,更聪明的解决方案是使用私有嵌套类:

template <typename T, typename Alloc>
class EboContainer
{
    struct Impl : Alloc
    {
        Impl(Alloc const & a) : Alloc(a) {}
        Node<T*> root;
    };
    Impl impl;

public:
    EboContainer(Alloc const & a = Alloc) : impl(a) {}
    Alloc get_alloc() const { return impl;  /* slicing */ }
    // ...
};

现在,该类与保存相关数据成员所需的大小完全相同。顺便提一下,这个实现是切片有用时的一个例子。