C++ 为什么Boost图形库在删除顶点时使所有迭代器无效?

C++ 为什么Boost图形库在删除顶点时使所有迭代器无效?,c++,boost,graph,boost-graph,C++,Boost,Graph,Boost Graph,在文档中,当您从图中移除顶点时(当其顶点至少存储在向量中时),所有迭代器(和描述符)都将失效 这让我感到惊讶,因为从语义上来说,似乎没有必要这样做 有没有一种方法可以使邻接列表在这种情况下不会使迭代器失效?我能不能在方便的时候让顶点“失效”并对其进行垃圾收集?这只是底层容器语义: 这显然也是一种折衷:你可以免费获得O(1)个顶点索引 如果需要其他内容,请为顶点容器使用不同的容器选择器(例如列表) (通常)在需要下一次调整大小时,只是“使”向量中的顶点无效并对其进行垃圾收集不是更好吗 将顶点标记为

在文档中,当您从图中移除顶点时(当其顶点至少存储在向量中时),所有迭代器(和描述符)都将失效

这让我感到惊讶,因为从语义上来说,似乎没有必要这样做


有没有一种方法可以使邻接列表在这种情况下不会使迭代器失效?我能不能在方便的时候让顶点“失效”并对其进行垃圾收集?

这只是底层容器语义:

这显然也是一种折衷:你可以免费获得O(1)个顶点索引

如果需要其他内容,请为顶点容器使用不同的容器选择器(例如
列表

(通常)在需要下一次调整大小时,只是“使”向量中的顶点无效并对其进行垃圾收集不是更好吗


将顶点标记为已删除确实是一种常见的模式
boost::filtered_graph
是这种情况下的一个便捷适配器。

您知道这种情况是因为底层向量而发生的吗?如果你从一个迭代器中添加或删除元素,那么所有的迭代器都可能无效。我可以帮你编辑,但也许你想这么做。@sehe:更好?如果没有,请随意编辑。一个不同的设计选择,而不仅仅是将移除转移到容器上,可以让我省去权衡。2.我认为这是一个
过滤图
向每个顶点(或边,或两者)添加一个“已删除”的布尔属性,并覆盖删除操作?显然,这会让您获得另一个同样任意的权衡。过滤图只是过滤器。没有进行覆盖。通过将顶点添加到过滤集,可以“逻辑”删除顶点。我(和其他一些人)对此有答案,所以要证明这一点。