繁体   English   中英

当图形VertexList = vecS时remove_vertex

[英]remove_vertex when the graph VertexList=vecS

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

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

现在我想迭代我的顶点并删除那些具有特定属性的顶点。 我怎样才能做到这一点?

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

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

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

但是,可能存在一个工作: - 从N向下迭代到0 - 测试您的节点并在必要时删除它

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

如果你经常进行这种操作,它可能会相当慢,具体取决于图表的大小。

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

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

我不认为(在合理的时间内)使用vecS作为模板参数。 看看Boost的文档说:

如果VertexList的模板参数adjacency_listvecS ,那么所有顶点描述符,边描述符,并为图形迭代器会被全部无效。 <...>如果需要经常使用remove_vertex()函数, listS选择器是VertexList模板参数的更好选择。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM