【问题标题】:BGL: storing vertex descriptors in a way that they won't invalidateBGL:以不会失效的方式存储顶点描述符
【发布时间】:2015-11-15 19:18:25
【问题描述】:

问题是关于 Boost Graph Library。

假设我们用图的每个顶点存储一个对象,并且顶点和对象之间存在一一对应的关系。进一步假设我们维护一个std::map 以启用查找对应于给定对象的顶点描述符。

但是,在删除顶点的情况下,此解决方案似乎容易导致顶点描述符失效。有没有办法解决这个问题?

this问题中,出现以下句子:

我想以一种在删除顶点时不会失效的方式存储顶点描述符,所以我使用 boost::listS

好像那个问题的作者有解决顶点失效问题的办法,但我不明白它是什么。

编辑:澄清维护地图的原因。在以下场景中出现了基于对象查找顶点的需要。假设我们已经生成了一个对象。我们需要查找与我们刚刚生成的对象相等(在operator== 意义上)的对象对应的顶点。

【问题讨论】:

    标签: c++ boost


    【解决方案1】:

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

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

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

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

    【讨论】:

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