在 Boost Graph Library 中,为啥添加边会使边迭代器(和其他问题)无效?

Posted

技术标签:

【中文标题】在 Boost Graph Library 中,为啥添加边会使边迭代器(和其他问题)无效?【英文标题】:In the Boost Graph Library, why does adding an edge invalidate Edge iterators (and other questions)?在 Boost Graph Library 中,为什么添加边会使边迭代器(和其他问题)无效? 【发布时间】:2015-11-23 21:27:45 【问题描述】:

关于BGL documentation中标有“描述符和迭代器失效摘要”的图表的几个问题:

    为什么添加边会使边和邻接迭代器无效;为什么 add_edge() 行的每一列都不是“OK”?不会简单地附加输入/输出边缘列表吗? 为什么在有向图的情况下删除边只会使边迭代器无效;为什么第二行倒数第二列不只是“EL=vecS”?在无向图的情况下,不会从两个边列表(一个用于源顶点,一个用于目标顶点)中删除一条边,这会使这两个列表中的迭代器无效?

谢谢!

【问题讨论】:

【参考方案1】:

所有这些效果都来自通常的Iterator invalidation rules

    为什么添加边会使边和邻接迭代器无效;为什么 add_edge() 行的每一列都不是“OK”?不会简单地附加输入/输出边缘列表吗?

是的,它们将被附加。而且,看到他们这样做可能会重新分配,他们使迭代器无效。

    如果图是有向的,为什么删除边只会使边迭代器无效

矩阵中的符号有点混乱。

Docs: "此操作会导致任何未完成的边缘描述符或指向边缘 (u,v) 的迭代器变为无效。此外,如果 OutEdgeList 选择器是 vecS,则此操作将使任何迭代器无效在无向和双向情况下,指向顶点u 和顶点v 的边列表。此外,对于有向图,这会使任何edge_iterator 无效。"

所以你误读了:它不仅使“如果图形是定向的”无效。在无向和双向情况下,它使指向目标顶点 (v) 的边列表的任何迭代器无效。如果您了解后端是如何存储的,那么这是有道理的。

【讨论】:

啊,重新分配!非常感谢!迭代器直接指向列表,而不是与列表开头的偏移量。也感谢您挖掘出该文档简介。非常感谢。

以上是关于在 Boost Graph Library 中,为啥添加边会使边迭代器(和其他问题)无效?的主要内容,如果未能解决你的问题,请参考以下文章

图的割集,Boost Graph Library

BGL(boost graph Library)(8-)

使用Boost Graph库查找连接的组件,顶点和边缘类型为boost :: listS

Boost::graph Dijkstra : 最初填充队列

删除顶点并再次添加它会导致 boost::graph 崩溃?

使用整数索引访问 boost::graph 中的特定边