让我们说,我想保留对顶点的引用。例如。在有限状态机中,我想标记开始状态和最终状态。首先想到的是Graph:vertex_descriptor。但是,它是一个无符号整数,如果从图中删除了一个顶点,剩余的顶点可以重新编号。
那么保持不受顶点去除的顶点的引用是一种好方法(当然除非删除了引用的顶点本身)。谢谢!
答案 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}}的特征。我想这也是一个黑客,但它是一个相当安全的。