C++ 从Boost图中删除多个顶点

C++ 从Boost图中删除多个顶点,c++,boost,graph,C++,Boost,Graph,为什么图形中没有同时删除多个顶点的例程?如果顶点是vecS,则只有remove_vertex()非常昂贵 在boost/graph/detail/adjacency_list.hppremove_vertex_dispatch()starting line#1966例程中,删除给定节点,然后重新索引边。是否可以添加另一个例程,例如,删除顶点的索引,并在一次快照中删除它们(如何删除?可以讨论),然后重新索引只发生一次 我知道使用列表可以使时间保持恒定,但并非所有算法都适用于列表,因此这是不可能的。

为什么图形中没有同时删除多个顶点的例程?如果顶点是
vecS
,则只有remove_vertex()非常昂贵

在boost/graph/detail/adjacency_list.hpp
remove_vertex_dispatch()
starting line#1966例程中,删除给定节点,然后重新索引边。是否可以添加另一个例程,例如,删除顶点的索引,并在一次快照中删除它们(如何删除?可以讨论),然后重新索引只发生一次


我知道使用列表可以使时间保持恒定,但并非所有算法都适用于列表,因此这是不可能的。

如果删除顶点,则无法避免对所有边重新编制索引并更新向量。这有一个非局部代价,它至少与顶点的数量成线性关系,这可能确实是代价高昂的

也就是说,您可以使用的一种技术是在最初设置为true的每个顶点中缓存布尔值。现在,若要删除顶点,请删除连接到该顶点的所有边,并将“顶点布尔值”设置为false。这样,删除时间只是局部的,并且与顶点的数量没有线性关系。然后,您需要调整某些操作,例如迭代顶点,只选择布尔值设置为true的顶点


这种技术非常常见,例如,它用于简化三维三角剖分(迭代删除顶点,并希望快速获得局部成本)。与列表相比,您仍然可以直接访问您的顶点(删除顶点后,顶点控制柄仍然有效)。

深刻的回答。你有我的权利,我已经在使用这项技术了。但我的情况是,该图可以使用数周,添加和删除大量节点。在这段时间内,它被序列化以保存并重新打开。我只在序列化之前尝试实际删除“已删除”节点。我想知道是否可以操纵序列化字符串来删除“已删除”节点,因为它们没有in或out边。