![](/img/trans.png)
[英]Boost Graph: What happens when calling remove_vertex on vertex with degree > 0
[英]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_list
是vecS
,那么所有顶点描述符,边描述符,并为图形迭代器会被全部无效。 <...>如果需要经常使用remove_vertex()
函数,listS
选择器是VertexList
模板参数的更好选择。
在listS
的情况下,迭代器不会通过调用remove_vertex
而无效,除非迭代器指向已移除的实际顶点。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.