如何获取std::map
或begin()
的根节点?它提供了获取end()
和per
迭代器的函数,但我没有在文档中看到有关获取根的任何内容。
答案 0 :(得分:2)
你做不到。这就是为您提供迭代器的原因 - 从实现细节中抽象出自己。而且,我刚刚在"树"上完成了Ctrl + F. C ++ Standard中的关键字,只发现了5次,其中没有一个与set / map实现细节有关。
如果您需要二叉树的根 - 创建自己的数据结构。
答案 1 :(得分:1)
任何Abstract Data Types中都没有根节点的概念(set
和map
都没有。它们作为red–black tree实现的事实只是一个实现细节。
以下是支持的操作:
在维基百科页面上,ADT的一个好处是:
<强>封装强>
抽象提供了ADT的任何实现具有某些属性和能力的承诺;知道这些是使用ADT对象所需的全部内容。用户不需要任何关于实现如何使用ADT的技术知识。通过这种方式,实现可能很复杂,但在实际使用时将封装在简单的界面中。
似乎你试图破解那种试图过多了解实现的封装。
答案 2 :(得分:1)
我也在看这个功能。除非我们反复遍历地图/集合,否则我们似乎无法直接获取stl地图或集合的根值。
Ex:从地图的总大小中,获取根索引(即size / 2),然后进行迭代,直到覆盖了地图中的那么多元素为止。由于stl映射在内部是平衡树,因此该方法将起作用。
我为什么需要这个?
对于一个问题,我想获得中位数。最简单的方法是返回根(或根及其右子项的平均值)。
我也有自己的二叉树实现,可以在这里使用。但是对于这个问题,我希望树能够保持平衡。
我有以下选择-
使用stl映射。这是一个平衡的DS。但是,没有简单的方法可以通过索引号获取根或元素。例如:我无法在索引4处获得该元素。 因此,我一直在考虑遍历地图直到找到根。 很好,快速,轻松-但是计算中位数将花费O(n / 2)。
实现一棵平衡树并添加一个函数以返回根值。还有更多工作要做。但是,我可以获取O(1)时间的中位数。
如果您能想到一种更好的方法,请告诉我。