什么是一个好的和稳定的C ++树实现?

我想知道是否有人可以推荐一个好的C ++树实现,希望尽可能兼容。

为了logging,我以前写了很多次树algorithm,我知道它可能很有趣,但是我想要尽可能地实用而懒惰。 因此,实际的解决scheme链接就是这里的目标。

注:我正在寻找一个通用的树,而不是一个平衡的树或一个地图/集,树的结构本身和连通性在这种情况下是重要的,不仅是数据内。 所以每个分支需要能够保存任意数量的数据,每个分支应该分别迭代。

我不知道你的要求,但是如果你主要对结构感兴趣的话,用图表(例如在Boost Graph中实现 )不是更好吗? ? 你可以通过graphics“模仿”一棵树,也许它会(在概念上)更接近你要找的东西。

看看这个 。

C ++的tree.hh库为n元树提供类STL的容器类,模板化了存储在节点上的数据。 提供了各种types的迭代器(后序,预定和其他)。 在可能的情况下,访问方法与STL兼容,或者可以使用替代algorithm。

HTH

我将build议使用std :: map而不是树。

树的复杂性特征是:

插入:O(ln(n))
去除:O(ln(n))
find:O(ln(n))

这些是std :: map保证的相同特征。
因此,std :: map的大多数实现都使用了一个树(红黑树)在封面下(虽然在技术上这不是必需的)。

好的人,我发现了另一个树库 ,但还没有尝试过

如果你没有(键,值)对,但只是键,使用std :: set。 它使用与std :: map相同的红黑树。

假设问题是关于平衡的(以某种forms,大多是红黑树)二叉树,即使情况并非如此。

平衡的二进制树,就像向量一样,可以pipe理元素的一些sorting,而不需要任何密钥(比如通过向量中插入元素),但是:

  • 对于一个元素的所有修改(在开始,结束任何迭代器之前和之后的添加/移除),具有最优的O(log(n))或更好的复杂性,
  • 除了直接破坏迭代器指向的元素之外,通过任何修改持久化迭代器。

可选地,可以像在向量中那样通过索引来支持访问(具有一个size_t元素的成本),具有O(log(n))复杂度。 如果使用,迭代器将是随机的。

有select地,顺序可以通过一些比较函数来强制执行,但迭代器的持久性允许使用不可重复的比较scheme(例如:堵塞期间的任意车道改变)。

在实践中,平衡二叉树具有向量,列表,双链表,map,multimap,deque,queue,priority_queue等接口,为所有单元操作获得理论上最优的O(log(n))复杂度。

<sarcastic>这可能就是为什么c ++ stl不会提出这个build议的</ sarcastic>

由于难以得到正确的平衡pipe理,特别是在元素提取过程中,个体不能自行实施一般平衡树。

没有广泛可用的平衡二叉树的实现,因为现有技术的红黑树(此时由于在移除期间固定数量的昂贵的树重组而得到的最佳types的平衡树)知道实现,被每个实现者从结构发明者的初始代码不允许迭代器持久性。 这可能是没有完整的function树模板的原因。