BGL:以不会失效的方式存储顶点描述符
Posted
技术标签:
【中文标题】BGL:以不会失效的方式存储顶点描述符【英文标题】:BGL: storing vertex descriptors in a way that they won't invalidate 【发布时间】:2015-11-15 19:18:25 【问题描述】:问题是关于 Boost Graph Library。
假设我们用图的每个顶点存储一个对象,并且顶点和对象之间存在一一对应的关系。进一步假设我们维护一个std::map
以启用查找对应于给定对象的顶点描述符。
但是,在删除顶点的情况下,此解决方案似乎容易导致顶点描述符失效。有没有办法解决这个问题?
this问题中,出现以下句子:
我想以一种在删除顶点时不会失效的方式存储顶点描述符,所以我使用 boost::listS
好像那个问题的作者有解决顶点失效问题的办法,但我不明白它是什么。
编辑:澄清维护地图的原因。在以下场景中出现了基于对象查找顶点的需要。假设我们已经生成了一个对象。我们需要查找与我们刚刚生成的对象相等(在operator==
意义上)的对象对应的顶点。
【问题讨论】:
【参考方案1】:对顶点容器选择器使用listS
或setS
使失效保证等于相应的标准库容器 (Iterator invalidation rules)。
一般来说,基于节点的容器不会使任何迭代器失效,除非被移除。
在这一点上,我也想建议捆绑属性,您根本不必维护从对象到顶点描述符/索引的映射。
示例(即将发布:https://www.livecoding.tv/sehe/)
【讨论】:
“您根本不需要维护从对象到顶点描述符/索引的映射”。我认为捆绑属性负责相反的方向。它们如何帮助按对象查找顶点描述符? 这个想法是你总是遍历图形的顶点列表,然后 我猜sample of the bundled approach 有点晚了,现在:) 无论如何,setS
/listS
有一个关键:提防可能的性能影响和(外部?)许多算法的顶点 id 映射
你不能总是这样做。假设您生成一个新对象,并希望到达图中的一个顶点,该顶点对应于一个与新对象相等(在operator==
的意义上)的对象,例如将其连接到不同的顶点(对象)...
我错过了这个回复完全回答了这个问题的事实。这是因为,对于 std::list,只有被擦除元素的迭代器才会失效。因此,使用 listS,在删除一个顶点时,只有一个顶点描述符受到影响,而地图的其余部分保持有效!以上是关于BGL:以不会失效的方式存储顶点描述符的主要内容,如果未能解决你的问题,请参考以下文章