C++ 当graph VertexList=vecS时,删除_顶点

C++ 当graph VertexList=vecS时,删除_顶点,c++,boost,boost-graph,C++,Boost,Boost Graph,我有一个顶点列表=vecS的Boost图 typedef adjacency_list <listS, vecS, undirectedS, TrackInformation, LinkInformation> TracksConnectionGraph; typedef邻接列表轨迹连接图; 现在,我想遍历我的顶点并删除那些具有特定属性的顶点。我该怎么做 问题是每当我调用remove_vertex时,图中顶点的迭代器以及顶点描述符都会失效。我认为使用vecS作为模板参数(在合理的

我有一个顶点列表=vecS的Boost图

typedef adjacency_list <listS, vecS, undirectedS, TrackInformation, LinkInformation> TracksConnectionGraph;
typedef邻接列表轨迹连接图;
现在,我想遍历我的顶点并删除那些具有特定属性的顶点。我该怎么做


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

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

如果
邻接列表
顶点列表
模板参数为
vecS
,则此操作将使图形的所有顶点描述符、边描述符和迭代器无效。如果需要频繁使用
remove_vertex()
函数,则
列表
选择器是
VertexList
模板参数的更好选择


列表
的情况下,除非迭代器指向已删除的实际顶点,否则不会通过调用
删除顶点
使迭代器无效。

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

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

然而,可能会有一个作品围绕着: –从N向下迭代到0 –测试您的节点,必要时将其删除

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

如果您经常进行这种操作,根据图形的大小,操作可能会非常缓慢

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


因此,很抱歉,没有真正的答案,但我希望您能设法从中获得一些信息。

列表的问题是,我无法让连接的组件使用它。如果你只对向量进行操作,这会很好。但是,
adjacence\u list
管理它,并且无论如何都需要重新索引边。它可能会选择在
n
删除后重新分配向量(再次使所有迭代器无效)。最后,反向迭代
顶点(图)
不能保证等同于反向迭代顶点的内部向量这是非常值得研究的。但是如何在删除相邻顶点时跟踪垃圾顶点会使顶点描述符无效?