在 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库查找连接的组件,顶点和边缘类型为boost :: listS
Boost::graph Dijkstra : 最初填充队列