#include #include // for std::cout #include // for std::pair #include // for std::for_each #include // for boost::tie #include #include #include #include using namespace boost; #include #include template using Invoke = typename T::type template using RemoveRef = Invoke; template using OutEdgeIterator = typename boost::graph_traits::out_edge_iterator; template auto out_edges_range(V&& v, G&& g) -> boost::iterator_range>> { auto edge_pair = out_edges(std::forward(v), std::forward(g)); return boost::make_iterator_range(edge_pair.first, edge_pair.second); } template struct exercise_vertex { exercise_vertex(Graph& g_, const char name_[]) : g(g_),name(name_) { } typedef typename graph_traits::vertex_descriptor Vertex; void operator()(const Vertex& v) const { using namespace boost; typename property_map::type vertex_id = get(vertex_index, g); std::cout << "vertex: " << name[get(vertex_id, v)] << std::endl; std::cout << "\tout-edges: "; /*for (auto &e : out_edges(v, g)){ std::cout<<"!"; } //*/ typename boost::graph_traits::out_edge_iterator out_i, out_end; typename boost::graph_traits::edge_descriptor e; for (std::tie(out_i, out_end) = out_edges(v, g); out_i != out_end; ++out_i) { e = *out_i; Vertex src = source(e, g), targ = target(e, g); std::cout << "(" << name[get(vertex_id, src)] << "," << name[get(vertex_id, targ)] << ") "; } std::cout << std::endl; } Graph& g; const char *name; }; int main(int,char*[]) { typedef adjacency_list > Graph; enum { A, B, C, D, E, N }; const int num_vertices = N; const char name[] = "ABCDE"; typedef std::pair Edge; Edge edge_array[] = { Edge(A,B), Edge(A,D), Edge(C,A), Edge(D,C), Edge(C,E), Edge(B,D), Edge(D,E), }; const int num_edges = sizeof(edge_array)/sizeof(edge_array[0]); float transmission_delay[] = { 1.2, 4.5, 2.6, 0.4, 5.2, 1.8, 3.3, 9.1 }; Graph g(edge_array, edge_array + num_edges, transmission_delay, num_vertices); std::for_each(vertices(g).first, vertices(g).second, exercise_vertex(g, name)); return 0; }