【发布时间】:2017-10-12 06:46:43
【问题描述】:
在使用 BOOST 图形库时,我有一个完全初始化的图形实例——结构现在是静态的。我需要根据图表做一些处理。
我不清楚我应该使用顶点和边的迭代器类型,还是顶点和边类型本身?
typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::bidirectionalS, VertexProperty, EdgeProperty > GraphType;
typedef typename boost::graph_traits< GraphType >::vertex_descriptor VertexType;
typedef typename boost::graph_traits<GraphType>::vertex_iterator VertexIterator;
typedef typename boost::graph_traits< GraphType >::edge_descriptor EdgeType;
typedef typename boost::graph_traits<GraphType>::out_edge_iterator EdgeIterator;
我有一个算法,我需要检查两条边是否“相同”。 (在最强烈的意义上。假设该图有两条平行边连接 E1(S1,T2) 和 E2(S1,T2)。一条边最多只能与其中一条“相同”。
(edge_descriptor == edge_descriptor) 和 (edge_iterator == edge_iterator) 之间有什么区别?关于顶点的相同问题。
大多数图函数返回迭代器而不是边/顶点类型本身。
我还需要存储一组边。 不确定我应该存储 EdgeType 还是EdgeIterator?
std::vector<EdgeType> processedEdges;
std::vector<EdgeIterator> processedEdges;
vit = std::find( processedEdges.begin(), processedEdges.end(), anotherEdgeRef )
if ( vit == processedEdges.end() )
doSomethingBasedOnEdgeProperty(*vit);
参考: http://www.boost.org/doc/libs/1_64_0/libs/graph/doc/adjacency_list.html
【问题讨论】:
-
如果我将迭代器类型一般视为“指向知道如何迭代的实例的指针”,那么似乎很自然的事情就是使用(例如 operator==)并存储迭代器。显然,如果图结构发生变化,它们可能无效,所有迭代器必须针对同一个图实例。