我有一个 boost::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。2. 我认为不应该在边的其他节点上调用 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() 函数会涉及查找相邻节点并返回找到的第一个节点吗?
我在调用相邻顶点()时观察到的情况相同。文档说它建模为 out_edge_iterator < edge_predicate , ... > 。
我得到了我的预期结果。但我想知道我的猜测是否正确?我没有为过滤图提供任何 edge_predicate 。
请建议。