过滤BOOST图中现有的filtered_graph

时间:2014-01-22 06:07:57

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

继续上一个问题HERE,是否可以在现有的过滤图上定义/初始化filtered_graph。例如,

  class A{
  FilteredGraphType_t fg // it is a typedef

  // constructor
  template < typename ... , typename fil_graph >
  A ( ..init parameters.. , fil_graph& FG)    // note this. 
   {

      predicate  filter3 ( ... );   // defined predicate 

      // define new filtered_graph here in constructor
      FilteredGraphType_t  newFG ( boost::make_filtered_graph( FG, filter3)  .. // error

       write_graphviz(std::cout, newFG ); /// error 

   }
   };

我可以这样做吗?

 FilteredGraphType fg3( fg3, filter3) ;  // call filter and predicate on itself
  OR 
  FilteredGraphType fg4( fg3, filter3) ;  ( new filtered graph fg4 filtering over fg3 

当我尝试在现有的过滤图上创建新过滤器时,我遇到了编译器错误....但是,我可以在原始图上定义一个新的过滤器..

另外我如何调用谓词 - &gt; FG 上的filter3作为构造函数参数(通过引用)获得

1 个答案:

答案 0 :(得分:1)

  1. 是的,完全可以在过滤后的图表上使用过滤图表。它应该具有与在原始图表上组合过滤器相同的效率。

  2. 请记住,filtered_graph<G,EFG>是与filtered_graph<F,EFF>类型不同的类型。您的编译器错误可能会发生,因为您在代码的两个位置使用相同的FilteredGraphType_t

  3. 正确的代码可能如下所示:

    Graph g;
    
    typedef filtered_graph<G,EPred> FilteredGraphType_t;    
    FilteredGraphType_t fg(g, pred);
    
    typedef filtered_graph<FilteredGraphType,SomePred> DeepFilteredGraphType_t;   
    DeepFilteredGraphType_t dfg(fg, somePred);
    
    1. AFAIK,没有记录的方法来访问用于形成过滤图的“原始”谓词。未记载的方法是使用Boost代码的内部结构如下:

      FilteredGraphType_t fg = ...

      EPred edgeFilter = fg.m_edge_pred;

      FilteredGraphType_t :: edge_descriptor ed = ... bool edge_ok = edgeFilter(ed); //与edgeFilter.operator()(ed)相同;

    2. 似乎推荐的方法是将您的filter3谓词作为A类成员。