当图形VertexList = vecS时remove_vertex

时间:2010-07-06 04:03:24

标签: c++ boost boost-graph

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

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

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

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

3 个答案:

答案 0 :(得分:3)

可能是,在迭代之前你可以制作特殊的“Trash”顶点,在迭代过程中你将所有删除节点连接到该Trash-vertex,并在迭代后删除所有“Trash-connected”顶点?

答案 1 :(得分:3)

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

然而,可能会有一个工作: - 从N下降到0 - 测试您的节点并在必要时删除它

这假设(并且我不确定,但相当自信)它只会重新编号之后>你刚刚删除的那个顶点。

如果你经常进行这种操作,根据图表的大小,它可能会相当慢。

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

所以,抱歉,没有真正的答案,但我希望你能设法从中得到一些东西。

答案 2 :(得分:1)

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

  

如果VertexList的{​​{1}}模板参数为adjacency_list,则此操作将使图的所有顶点描述符,边描述符和迭代器无效。 &LT; ...&GT;如果您需要经常使用vecS函数,remove_vertex()选择器是listS模板参数的更好选择。

如果VertexList,除非迭代器指向已移除的实际顶点,否则调用listS不会使迭代器失效。