gpt4 book ai didi

c++ - 在 BOOST Graph 中过滤现有的 filtered_graph

转载 作者:行者123 更新时间:2023-11-28 07:09:14 25 4
gpt4 key购买 nike

继续我之前的问题 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

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

另外,如何在作为构造函数参数获取的 FG 上调用谓词 --> filter3(通过引用)

最佳答案

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

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

正确的代码可能是这样的:

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. 据我所知,没有记录的方法来访问用于形成过滤图的“原始”谓词。未记录的方法是使用 Boost 代码的内部结构,如下所示:

    FilteredGraphType_t fg = ...

    EPred edgeFilter = fg.m_edge_pred;

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

似乎推荐的方法是让您的 filter3谓词作为你的类 A 的成员。

关于c++ - 在 BOOST Graph 中过滤现有的 filtered_graph,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21275455/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com