有没有办法访问C++ Boost rtree 中的非叶节点



提前抱歉,这是一个非常具体的问题,我无法提供任何代码,因为这是为了我的工作,因此是保密的。

我正在使用 Boost R 树,我需要实现的算法需要访问树的非叶节点。使用 Boost rtree 库,我只能以简单的方式访问叶节点。我注意到有一个功能可以打印所有节点,包括非叶节点(这意味着它们存在,它们是计算的(,以及它们的位置、它们在树中的级别等,但我无法以与叶节点相同的方式访问它们。

目前,我拥有的最佳解决方案是为树实现一个访问者并重载运算符 (( 来收集节点(这就是 print 方法访问节点的方式(。

我的问题是,有没有人知道一种更简单的方法来访问非叶节点?因为这个似乎效率不高,而且每次我想访问非叶节点时,我都会浪费时间。此外,我需要复制没有点的树的结构,如果我无法访问非叶节点,我就无法做到这一点。

提前谢谢你!

我不知道你到底想做什么,所以这将是一个一般性的答案。

为了首次访问树节点,您必须遍历树结构。在 Boost.Geometry 中,rtree 访问者模式用于此目的。您可以手动执行此操作,但在内部使用Boost.Variant 来表示节点,因此您最终会得到变体访问者。此时,您有几个选项,具体取决于您将如何处理节点。你要修改 r 树吗?rtree 会在内存中移动吗?节点的地址会改变吗?您将访问多少个节点?是否要存储对节点的某种引用并从该点遍历树结构?您想向下还是向上遍历结构?

您注意到的一个选项是每次遍历树结构。如果树结构可以更改,这是一个很好的方法。明显的缺点是您必须使用某种条件检查每个节点上的所有子节点(无论您做什么才能选择感兴趣的节点(。

如果树结构没有更改,但树被复制到内存中的其他位置,则可以将节点表示为从根到感兴趣节点的路径,作为子节点的索引列表。 例如,列表 {1, 2, 3} 含义:使用根节点的子节点 1 遍历树, 然后在下一级选择子节点 2,然后您的节点将是下一级的子节点 3。在这种情况下,您仍然需要遍历树,但不必再次检查条件。

如果树没有更改并且节点保留在内存中的同一位置,则可以简单地使用指针或引用。

最新更新