Boost Graph Library:如何保持对顶点的永久引用? (即不受顶点重新编号)

时间:2014-07-22 00:38:14

标签: c++ boost graph

让我们说,我想保留对顶点的引用。例如。在有限状态机中,我想标记开始状态和最终状态。首先想到的是Graph:vertex_descriptor。但是,它是一个无符号整数,如果从图中删除了一个顶点,剩余的顶点可以重新编号。

那么保持不受顶点去除的顶点的引用是一种好方法(当然除非删除了引用的顶点本身)。谢谢!

1 个答案:

答案 0 :(得分:2)

如果您参考表格" Descriptor和Iterator Invalidation摘要。"在this page上,如果使用vecS作为VertexList adjacency_list模板参数,您将看到顶点描述符仅在顶点删除期间失效。你想要永远不会失效的顶点描述符(除非它们被删除),你应该使用listS代替(vecS除了listS,但对于顶点,你更好只需使用vecS)。

我在某些情况下使用的另一种可能性是,在适用的情况下,将两个(开始,最终)顶点放置在图形的最开头(前两个顶点)不要失效你添加到图表)。当您这样做时,即使使用adjacency_list,顶点的移除也不会移动第一个顶点的位置(仅在移除顶点之后的位置)。然而,这是一个黑客,你不应该过分依赖这个技巧。

我还实现了vecS类的替换,它还包含一个池化容器的选项,该容器具有vertex_descriptor的大部分优点(例如locality),但保留了各处的顶点描述符。你可以check it out,但要注意它尚未准备好生产。

至于选择引用顶点的方式..答案总是vertex_iterator。其他任何事情都不是很安全。迭代器只用于遍历,而不是用作"指针"。

编辑:如果你需要在通用函数的上下文中测试特定的Graph类型是否具有" persistent"顶点描述符,我不知道有任何直接测试,但你可以检查顶点迭代器上的迭代器类别。如果迭代器类别是"随机访问",那么它通常意味着顶点描述符不是持久的(可能被删除无效)。通过迭代器类别,我的意思是,从std::iterator_traits获得{{1}}的特征。我想这也是一个黑客,但它是一个相当安全的。