【问题标题】:Trying to understand libstdc++'s implementation of std::multiset试图理解 libstdc++ 对 std::multiset 的实现
【发布时间】:2018-03-02 07:03:59
【问题描述】:

我试图查看 libstdc++ 的 std::multiset 实现(只是因为我很好奇),我发现了这一行 https://github.com/gcc-mirror/gcc/blob/master/libstdc%2B%2B-v3/include/bits/stl_multiset.h#L118,但不知道该怎么做。我理解它的方式,_Rb_tree class 是一个单元素树,那条线是如何把它变成一个多重集的?

按照我的理解,该行只是将分配器调整为另一种类型。还是我理解错了?


这是链接代码

private:
  /// This turns a red-black tree into a [multi]set.
  typedef typename __gnu_cxx::__alloc_traits<_Alloc>::template
rebind<_Key>::other _Key_alloc_type;

  typedef _Rb_tree<key_type, value_type, _Identity<value_type>,
           key_compare, _Key_alloc_type> _Rep_type;
  /// The actual tree structure.
  _Rep_type _M_t;

【问题讨论】:

  • 您能否在问题中包含您所质疑的代码而不是使用链接?
  • @1201ProgramAlarm 完成

标签: c++ c++11 gcc libstdc++ multiset


【解决方案1】:

_Rb_tree 不决定是否允许重复值;它甚至不知道它是否只有一个值或一个单独的键和值(当用作map 时,它从pair 派生一个键)。该注释仅表明正在选择模板参数,这使得_Rb_tree 可用作集合或多重集合。文件前面的评论指出

私有树数据的声明方式与 set 和
完全相同 多组;区别完全在于树函数的方式
称为(*_unique 与 *_equal,与标准相同)。

【讨论】:

  • 但是数据结构必须支持某种重复值的存储,对吧?你能指出那是哪里吗?
  • 一个_Rb_tree无论如何都有很多节点;正如评论所说,它提供了名为 ..._unique 和 ..._equal 的函数,因此策略取决于客户端(分别为 setmultiset)。
  • @Curious 这棵树根本不需要做任何特别的事情。它只是支持给定某个键的插入操作,它基本上是通过为键找到正确的位置然后在那里执行插入来完成的。如果碰巧有相同的,那没关系。唯一重要的唯一方法是树平衡算法是否假设如果!(x&lt;y),那么y &lt; x。如果您的平衡算法不假设,那么为什么最低级别的树必须关心?唯一性可以通过对插入进行检查来实现。
  • @NirFriedman 我正在寻找用于许多节点的数据结构。是链表吗?它是一个向量吗?那种东西。由于某种原因我找不到那段代码...
  • 它是一棵红黑树。出于代码大小的原因,parent and 2 child pointers_Rb_tree_node_base 中。
猜你喜欢
  • 1970-01-01
  • 2012-11-07
  • 2019-08-19
  • 2013-06-05
  • 1970-01-01
  • 2012-08-14
  • 2011-07-10
  • 1970-01-01
  • 2016-06-24
相关资源
最近更新 更多