C++ Boost图形库:如何保持对顶点的永久引用?(即不受顶点重新编号的限制)
比方说,我想保留对顶点的引用。例如,在有限状态机中,我想标记开始状态和最终状态。首先想到的是图形:顶点描述符。但是,它是一个无符号整数,如果从图中删除一个顶点,则可以对其余顶点重新编号 那么,保留不受顶点移除影响的顶点引用的好方法是什么(当然,除非被引用顶点本身被移除)。谢谢 如果您参考表“描述符和迭代器无效摘要”。在上,您将看到,如果您将C++ Boost图形库:如何保持对顶点的永久引用?(即不受顶点重新编号的限制),c++,boost,graph,C++,Boost,Graph,比方说,我想保留对顶点的引用。例如,在有限状态机中,我想标记开始状态和最终状态。首先想到的是图形:顶点描述符。但是,它是一个无符号整数,如果从图中删除一个顶点,则可以对其余顶点重新编号 那么,保留不受顶点移除影响的顶点引用的好方法是什么(当然,除非被引用顶点本身被移除)。谢谢 如果您参考表“描述符和迭代器无效摘要”。在上,您将看到,如果您将vecS用作VertexList模板参数,则顶点描述符仅在顶点删除期间无效。如果希望顶点描述符永远不会失效(除非它们是要删除的描述符),则应改用列表(或除向量
vecS
用作VertexList
模板参数,则顶点描述符仅在顶点删除期间无效。如果希望顶点描述符永远不会失效(除非它们是要删除的描述符),则应改用列表
(或除向量
以外的任何其他描述符,但对于顶点,最好只使用列表
)
我在某些情况下使用的另一种可能性是,在适用的情况下,将不希望无效的两个(开始,最终)顶点放置在图形的最开始处(添加到图形的前两个顶点)。执行此操作时,即使使用vecS
,移除顶点也不会移动第一个顶点的位置(仅移动移除顶点之后的顶点)。然而,这是一个黑客,你不应该太依赖这个技巧
我还实现了对邻接列表
类的替换,该类还包括一个池容器选项,该容器具有向量
的大部分优点(例如局部性),但在任何地方都保留顶点描述符。您可以,但需要注意的是,它还没有完全准备好生产
至于选择引用顶点的方式。。答案总是顶点描述符
。其他任何东西都不安全。迭代器仅用于执行遍历,不能用作“指针”
编辑:如果您需要在泛型函数的上下文中测试特定图形类型是否具有“持久”顶点描述符,我不知道是否有任何直接测试,但您可以在顶点迭代器上检查迭代器类别。如果迭代器类别是“随机访问”,那么它通常意味着顶点描述符不是持久的(可以通过删除而失效)。通过迭代器类别,我的意思是,从,得到顶点迭代器的特征。我想这也是一个小技巧,但它是相当安全的。现在可以使用
boost::stable_vector
吗?谢谢!整个BGL的事情开始有意义了:)