【问题标题】:remove_vertex when the graph VertexList=vecS当图 VertexList=vecS 时 remove_vertex
【发布时间】:2011-03-12 03:18:21
【问题描述】:

我有一个带有 VertexList=vecS 的 Boost Graph。

typedef adjacency_list <listS, vecS, undirectedS, TrackInformation, LinkInformation> TracksConnectionGraph;

现在我想遍历我的顶点并删除那些具有特定属性的顶点。我该怎么做?

问题是每当我调用 remove_vertex 时,图中顶点的迭代器以及顶点描述符都会失效。

【问题讨论】:

    标签: c++ boost boost-graph


    【解决方案1】:

    可能是,在迭代之前您可以制作特殊的“垃圾”顶点,在迭代期间您将所有删除节点连接到该垃圾顶点,并在迭代之后删除所有“垃圾连接”顶点?

    【讨论】:

    • 这很值得研究。
    • 但是当删除它的邻居时如何跟踪垃圾顶点会使顶点描述符失效?
    【解决方案2】:

    您的边存储在 std::vector 中。如果您有 N 个顶点,那么所有顶点的编号从 0 到 N。如果您删除一个,那么您的顶点将从 o 重新编号到 N-1。因此,您的描述符将失效。

    但是,可能有一个工作区: – 从 N 迭代到 0 – 测试您的节点并在必要时将其删除

    这假设(我不确定,但相当有信心)它只会对刚刚删除的顶点之后重新编号。

    如果您经常执行此操作,则可能会相当慢,具体取决于您的图表大小。

    如果这种方法不起作用,您将不得不从旧图构建一个新图(通过预先计算您将拥有多少顶点和边,这实际上可能相当快)。

    所以,对不起,没有真正的答案,但我希望你能从中得到一些东西。

    【讨论】:

    • 如果你只是对向量进行操作就好了。但是adjacency_list 管理它并且无论如何都需要重新索引边缘。它可能会选择在n 删除后重新分配向量(再次使 all 迭代器无效)。最后,不保证反向迭代vertices(graph) 等同于反向迭代顶点的内部向量
    【解决方案3】:

    我认为(在合理的时间内)将vecS 作为模板参数是不可能的。看看 Boost 文档是怎么说的:

    如果adjacency_listVertexList 模板参数为vecS,则该操作会使图的所有顶点描述符、边描述符和迭代器失效。 <...> 如果您需要频繁使用remove_vertex() 函数,listS 选择器是VertexList 模板参数的更好选择。

    listS 的情况下,迭代器不会通过调用 remove_vertex 而无效,除非迭代器指向被移除的实际顶点。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多