2014-01-21 1 views
0

Я надеялся, если есть какой-либо другой способ использования boost :: filter_graph() без функций print_edges() или print_graph().Использование boost filter_graph без print_graph()

по ссылке here, кажется, что фильтр работает на каждом узле только при вызове графа печати или функции края печати.

Я понимаю, что предикат действует на каждом узле или ребра графа, когда он становится печатается StD :: соиЬ

Есть ли другой способ, я мог бы использовать его? я могу использовать может быть for_each (begin_iter, end_iter) или что-то в этом роде? пожалуйста, предложите.

ответ

1

Вы можете использовать #include <boost/graph/graph_utility.hpp> где множество итераторов макросов определены: BGL_FORALL_EDGES, BGL_FORALL_VERTICES, BGL_FORALL_OUTEDGES и т.д.

Типичный код может выглядеть следующим образом:

BGL_FORALL_VERTICES(src, g, MyGraph_t) 
{ 
    BGL_FORALL_OUTEDGES(src, ed, g, MyGraph_t) 
    { 
     MyGraph_t::vertex_descriptor tgt = target(ed, g); 
     ... do something ... 
    } 
} 

Этот код будет работать независимо от того, является MyGraph_t filter_graph или adjacency_list или любой другой тип графика BGL.

+0

согласен, но будет ли он работать для предиката, который я использую для filter_graph? например, fg (G, edge_predicate) -> fg - отфильтрованный граф над G с предикатом края. Теперь, как мне использовать BGL_FORALL_XX() ?? .. мой крайний предикат принимает входные данные как край от графика и изменяет его свойства. когда вызывается граф печати, он проходит через каждое ребро и вызывает предикат на каждом ребре. как я это понимаю, используя BGL_FORALL_xxx ?? – Pogo

+0

Конечно. Он работает для любого типа диаграммы BGL. –