Replace BGL iterate over vertexes with "pure" C++11 alternative?
A simple wrapper over out_edges
should suffice:
#include <boost/range/iterator_range.hpp>
#include <type_traits>
template<class T> using Invoke = typename T::type
template<class T> using RemoveRef = Invoke<std::remove_reference<T>>;
template<class G> using OutEdgeIterator = typename boost::graph_traits<G>::out_edge_iterator;
template<class V, class G>
auto out_edges_range(V&& v, G&& g)
-> boost::iterator_range<OutEdgeIterator<RemoveRef<G>>>
{
auto edge_pair = out_edges(std::forward<V>(v), std::forward<G>(g));
return boost::make_iterator_range(edge_pair.first, edge_pair.second);
}
Or even simpler, a function that turns a std::pair
into a valid range:
template<class It>
boost::iterator_range<It> pair_range(std::pair<It, It> const& p){
return boost::make_iterator_range(p.first, p.second);
}
and then
for(auto e : pair_range(out_edges(v, g))){
// ...
}
Boost.Graph also provides convenience macros similar to BOOST_FOREACH
but designed specifically for Graph iterations.
Iteration over all vertices/edges of a given graph is provided by macros BGL_FORALL_VERTICES
/ BGL_FORALL_EDGES
and their template counterparts BGL_FORALL_VERTICES_T
/BGL_FORALL_EDGES_T
.
Iteration over in- or out- edges of a given vertex is provided by macros BGL_FORALL_OUTEDGES
or BGL_FORALL_INEDGES
. (Add _T for their template versions). For adjacency vertices use BGL_FORALL_ADJ
.
Example:
#include <boost/graph/iteration_macros.hpp>
typedef ... Graph;
Graph g;
BGL_FORALL_VERTICES(v, g, Graph) //v is declared here and
{ //is of type Graph::vertex_descriptor
BGL_FORALL_OUTEDGES(v, e, g, Graph) //e is declared as Graph::edge_descriptor
{
}
}
The macros work both in C++03 and C++11.