Say you have a boost::graph using so-called "bundled properties" (aka "inner properties) and you want to find the minimum and maximum value of the attributes. The standard library has this nice minmax_element() algorithm.
But... how can I use it on a graph inner properties ?
Say you have this kind of vertex, used in a graph definition (here undirected, but should also work for a directed graph):
struct vertex_properties { int val; }; typedef boost::adjacency_list< boost::vecS, boost::vecS, boost::undirectedS, vertex_properties > graph_t; typedef boost::graph_traits<graph_t>::vertex_descriptor vertex_t;
As an example, consider this program, creating a 3 vertices graph (and, yes, no edges here):
graph_t g; vertex_t v1 = boost::add_vertex(g); vertex_t v2 = boost::add_vertex(g); vertex_t v3 = boost::add_vertex(g); // Set vertex properties g[v1].val = 1; g[v2].val = 2; g[v3].val = 3;
To find the min/max value of the attributes, just call the algorithm with the right lambda function:
auto pit = boost::vertices( g ); auto result = std::minmax_element( pit.first, pit.second, [&] // lambda ( vertex_t v1, vertex_t v2 ) { return( g[v1].val < g[v2].val ); } );
This will return a pair of iterators on the min and max graph indexes. So, to get the results:
std::cout << "min=" << g[*result.first].val << " max=" << g[*result.second].val << '\n';
Aucun commentaire:
Enregistrer un commentaire