【问题标题】:To initialize a filtered_graph object in constructor after graph is defined in BOOST GRAPH在 BOOST GRAPH 中定义图形后,在构造函数中初始化 filters_graph 对象
【发布时间】:2026-01-11 05:00:01
【问题描述】:

我有一个关于在 boost 中初始化 filters_graph 的查询。

这是我的代码,

 // predicate 
 template <typename TGraph>
 struct edge_predicate
 {
   bool operator()(const typename boost::graph_traits<TGraph>::edge_descriptor& v) const
   {
     return true //testing purpose
    }
  };

// class 
class A{

 typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::undirectedS, Node_Info, Edge_Info > Graph_t;
 typedef boost::filtered_graph < Graph_t , edge_predicate > FilteredGraphType_t;

 // members
 Graph G;
 FilteredGraphType_t FG() ; // empty filter graph ???

 // constructor for A
 template < ..typename list > 
 A (  ... input iterators list...  )
 {
    fill the graph G with some values passed in constructor argument list.

    // predicate
    edge_predicate< Graph_t >  EPred;

    //filtered_graph
    FilteredGraphType_t FG( G, EPred);   // I am passing on edge predicate.
 }

};

// member function:
FilteredGraphType_t&   get_filtered_graph() 
{   
   return FG; 
 }

问题:

FG 是 A 类的成员,G 也是 A 的成员。最初 G 是空对象,我想 FG 也是,..

在 A 的构造函数中,我用我的逻辑(例如顶点数、边数等)填充图 G。 现在,我想在图 G 上创建一个过滤器 FG (它是 A 类的成员)(在 G 被填充之后)。

我想要这个的原因是这个过滤后的图是作为对其他类构造函数的引用传递的。这迫使我将 FG 设为 A 类的成员。(我可以在 A 本身的构造函数中创建过滤图的新实例,但它不会起到返回对 FG 的引用的目的。)

我希望它很清楚。请建议

【问题讨论】:

    标签: c++ graph boost-graph


    【解决方案1】:

    您可以使您的代码编译并正常工作。尝试按如下方式重新组织构造函数:

    // constructor for A
     template < ..typename list > 
     A (  ... input iterators list...  )
          : G() //calls constructor for G
          , EPred(...) //some constructor for predicate
          , FG( boost::make_filtered_graph(G, EPred) ) //creates your filtered graph
    {
    // fill the graph G with some values passed in constructor argument list.
    }
    

    其余代码可以保持不变。

    【讨论】:

    • 我不确定这是否可行,尽管它会编译。我想要的是在构造函数大括号内填充 G(边/顶点)之后在 Graph G 上工作的边谓词。 { }
    • 我按照你的建议做了以上事情。虽然它有效,但正如预期的那样,谓词仅适用于空图 G。我希望它在 G 被填充后工作(否则没有使用谓词。即使我在开始时使用空谓词,我该怎么做使用相同的谓词重用过滤后的图 fg ?@Michael Simbirsky
    • 在填充图形时,谓词会发生变化是很不寻常的。通常,谓词只是指向某个容器的轻量级指针。即使容器的内容发生变化,谓词也不会发生变化。
    • 但是,如果在您的情况下,谓词取决于图形,只需在构造函数末尾添加一行 FG =boost::make_filtered_graph(G, EPred);
    • 谢谢,我会试试的。我将谓词修改为函子,因此最初过滤器具有默认值,在填充图形后,它应该具有其他值,依此类推。
    最近更新 更多