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】:

对顶点容器选择器使用listSsetS 使失效保证等于相应的标准库容器 (Iterator invalidation rules)。

一般来说,基于节点的容器不会使任何迭代器失效,除非被移除。

在这一点上,我也想建议捆绑属性,您根本不必维护从对象到顶点描述符/索引的映射。

示例(即将发布:https://www.livecoding.tv/sehe/)

【讨论】:

“您根本不需要维护从对象到顶点描述符/索引的映射”。我认为捆绑属性负责相反的方向。它们如何帮助按对象查找顶点描述符? 这个想法是你总是遍历图形的顶点列表,然后 我猜sample of the bundled approach 有点晚了,现在:) 无论如何,setS/listS 有一个关键:提防可能的性能影响和(外部?)许多算法的顶点 id 映射 你不能总是这样做。假设您生成一个新对象,并希望到达图中的一个顶点,该顶点对应于一个与新对象相等(在operator== 的意义上)的对象,例如将其连接到不同的顶点(对象)... 我错过了这个回复完全回答了这个问题的事实。这是因为,对于 std::list,只有被擦除元素的迭代器才会失效。因此,使用 listS,在删除一个顶点时,只有一个顶点描述符受到影响,而地图的其余部分保持有效!

以上是关于BGL:以不会失效的方式存储顶点描述符的主要内容,如果未能解决你的问题,请参考以下文章

BGL 顶点上的随机顺序迭代

在无向图中通过其顶点找到一条边 [C++ BGL]

我应该使用迭代器或描述符来保持对边或顶点的引用吗?

我应该跟踪boost图库中的顶点描述符吗?

解决Spring国际化文案占位符失效问题的方法

java处理数据库不支持的emoji表情符