没有edge_predicate的BOOST filtered_graph中的out_edges()实现

时间:2014-01-28 01:55:40

标签: c++ boost iterator boost-graph filter-iterator

我有一个提升:: filtered_graph< Graph_t,boost :: keep_all,vertex_predicate>

FG 是我过滤后的图表。和 v1 是我想使用out_edge_iterators找到所有边缘的任何节点

edge_predicate这里是“keep_all” 顶点谓词是一些谓词,用于修改图的节点属性。

在文档中,给出了:

graph_traits<filtered_graph>::out_edge_iterator 
//The type for the iterators returned by out_edges(), which is:
filter_iterator<EdgePredicate, graph_traits<Graph>::out_edge_iterator>
The iterator is a model of MultiPassInputIterator.

现在,当我定义out_edge_iterators时:

out_edge_iterator begin, end;
boost::tie( begin, end) = out_edges ( v1, FG )

我的期望如下: 1.它应该考虑提供的edge_predicate并根据它过滤边缘。基本上开始结束迭代器应该是基于边缘谓词的filter_iterators。 我不认为应该在边缘的其他节点上调用vertex_predicate。例如,假设 v1 有3个边缘 (v1,v2), (v1,v4), (v1,v6)。

我的观察是: 在查找 v1 的out_edges的过程中,在v1的第一个相对节点上调用vertex_predicate。在上面的例子中,

suppose begin --> points to edge (v1, v2), then, 
out_edges(v1, G) ---> calls vertex_predicate on **v2**

为什么会这样?是因为out_edges()函数的实现会涉及查找相邻节点并返回找到的第一个节点?

调用adjacent_vertices()时我观察到的情况相同。文档说它模型为out_edge_iterator&lt; edge_predicate,...&gt; 。

我得到了预期的结果。但我想知道我的猜测是否正确?我没有向filter-graph提供任何edge_predicate。

请建议。

1 个答案:

答案 0 :(得分:1)

当过滤后的图形排除某些顶点时,它也会排除与之关联的所有边。这意味着即使您指定了keep_all,也会过滤掉一些边缘。

在内部,filtered_graph有一个特殊的边缘谓词(由边缘谓词和顶点谓词组合而成),用于过滤边缘。当你要求给定顶点的外边缘时,BGL会返回一对过滤器迭代器。

“结束”迭代器通常基于底层图的函数out_edges的“结束”。 “Begin”迭代器从函数out_edges的“begin”开始,检查边缘的“target”是否是图的一部分。如果不是,迭代器会跳过它,直到它找到一个好的顶点(或点击“结束”)。

因此迭代器不断检查“目标”顶点并调用顶点谓词。