[BGL] Change order of edge iterator

I want to be able to iterate through the edges in any given order, not just the order specified by tie(edge_iter, edges_end) = edges(g);. Is it possible to do something like the following. typename graph_traits<Graph>::edge_iterator edge_iter1, edges_end1, edge_iter2, edges_end2, edge_iter3, edges_end3; tie(edge_iter1, edges_end1) = edges(g); sort(edge_iter1, edges_end1, ordering_1()); tie(edge_iter2, edges_end2) = edges(g); sort(edge_iter2, edges_end2, ordering_2()); tie(edge_iter3, edges_end3) = edges(g); sort(edge_iter3, edges_end3, ordering_3()); (ordering_x() specified by some struct) Then I would have 3 different orderings of the edges available. Would this work or should I use an iterator adapter, or create a map and (if its possible) obtain an iterator from the mapping, or something else. Thanks

tie(edge_iter1, edges_end1) = edges(g); sort(edge_iter1, edges_end1, ordering_1());
tie(edge_iter2, edges_end2) = edges(g); sort(edge_iter2, edges_end2, ordering_2());
tie(edge_iter3, edges_end3) = edges(g); sort(edge_iter3, edges_end3, ordering_3());
(ordering_x() specified by some struct)
Then I would have 3 different orderings of the edges available.
Would this work or should I use an iterator adapter, or create a map and (if its possible) obtain an iterator from the mapping, or something else.
I think your best bet may be simply sorting a vector of iterators: pair<Iter, Iter> rng = edgesg); vector<Iter> iters(num_edges(g)); for(vector<Iter> i = iters.begin() ; rng.first != rng.second; ++i, ++rng.first) { *i = rng.first; } // For example: sort(iters.begin(), iters.end(), ordering_1()); // Iterating edges (in c++0x, for brevity). for(auto i = iters.begin(); i != end; ++i) { // **i should be a vertex descriptor. cout << g[**i] << "\n"; } There's probably a more concise way to implement that population of the vectors using std::generate. You should have more freedom to sort the vector of iterators as you see fit. Andrew Sutton
participants (2)
-
Andrew Sutton
-
John Robertson