|
Boost Users : |
From: Dima F. (quantera_at_[hidden])
Date: 2007-04-20 04:35:42
Aaron Windsor wrote:
> Your predicate should have const member functions - replace
>
> bool operator()(const vertex_t &v) {}
>
> bool operator()(const edge_t &e) {}
>
> with
> bool operator()(const vertex_t &v) const {}
>
> bool operator()(const edge_t &e) const {}
>
> and it should compile.
Thanks, it indeed compiles fine.
Is there are other restrictions on using filtered_graph with
breadth_first_search? The problem is that predicates of a filtered_graph
should be Default Constructable, and it seems that even though in an
example in a documentation of filtered_graph predicate has instance
members, predicates of filtered_graphs which are used in breadth_first_search
couldn't have any non-static members, because at some stage during the
search predicates are default-constructed, and values of it's members
are lost - for example, in order to be able to implement my idea of an
induced subgraph, I would like each predicate instance to have a pointer
to a graph to which filtering is going to be applied (see an example below).
Is it somehow possible to let predicates to a filtered_graph have
instance variables? Of course it is possible to use globals or static
members, but this is a bad solution.
P.S.: it seems that an idea of an induced graph can be realized by using
'subgraph' adaptor, but in a general case having predicates with instance
members or some equivalent of instance members looks like a good thing -
if at least it have been possible to get a reference to a graph given
it's edge or vertex the problem would have been much easier to solve,
but unfortunately it seems that graph's edge/vertex doesn't know anything
about a graph it belongs to.
Predicate example:
----------------------------------------------------------------
template <typename Graph, typename VertexCont>
class induced_graph_filter {
public:
typedef typename graph_traits<Graph>::edge_descriptor edge_t;
typedef typename graph_traits<Graph>::vertex_descriptor vertex_t;
induced_graph_filter() {}
induced_graph_filter(Graph *g, VertexCont *vert)
: m_g(g), m_vert(vert) {}
bool operator()(const vertex_t &v) const {
if (this::m_vert->find(v) != this::m_vert->end())
return true;
return false;
}
bool operator()(const edge_t &e) const {
if (m_vert->find(source(e, *m_g)) != m_vert->end() &&
m_vert->find(target(e, *m_g)) != m_vert->end())
{
return true;
}
return false;
}
Graph *m_g;
VertexCont *m_vert;
};
----------------------------------------------------------------
VertexCont can be, for example, a set or list of vertices of an
induced subgraph.
Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net