Boost图库的性能vertex_descriptor

时间:2014-01-30 13:12:43

标签: c++ vertex boost-graph

我对用于访问图中顶点的vertex_descriptor有疑问。 在我自己的先前实现中,我使用顶点上的指针,就像直接访问顶点一样。如果我想通过整数或其他东西访问IDVertex,我可以实现一个映射。

但是在BGL中,我不明白为什么vertex_descriptor是一个整数?我知道它用矢量制作了传感器。但是如果我想使用像10 ^ 6这样的大量顶点并且能够移除集合的任何顶点,我会使用地图。另外,在我的游戏中,我希望能够通过更符合逻辑的指针整数来引用每个节点吗?

BGL如何在no_random_access_container(如std :: set)中将整数与顶点链接起来?访问方法总是log(n)no?你能解释一下,如果有一个机制可以直接在顶点处理而不保留vertex_descirptor吗?

抱歉我的英文不好;)

1 个答案:

答案 0 :(得分:2)

当顶点容器策略定义为vecS,setS或listS时,vertex_descriptor变为[“value_type”指向相应容器中的迭代器。 vertex_iterator类型通常是此容器中的迭代器类型。

这意味着对顶点的访问总是O(1)。对于setS,添加和删除新顶点将花费O(logN),对于listS或vecS,添加和删除新的顶点将花费O(1)。在vecS但不是listS或setS的情况下,移除顶点将使一些其他顶点无效。有关详细信息,请参阅adjacency graph page上的迭代器和描述符稳定性/失效部分。

关于你的其他问题。如果要在顶点上直接保存(指针)数据,可以将其添加为顶点属性。

通常,您需要在数据和图形顶点之间进行某种一对一的映射。保持直接映射可以很方便,例如,boost :: unordered_set和inverse map作为每个顶点的属性。