Увеличить библиотеку графов, используя двух посетителей

После некоторых тестов я замечаю, что проблема с посетителем stamp_times:

typedef adjacency_list <vecS, vecS, undirectedS> Graph;
typedef graph_traits <Graph>::edge_descriptor Edge;
typedef graph_traits <Graph>::vertex_descriptor Vertex;Graph g(edges.begin(), edges.end(), n);

typedef graph_traits <Graph>::vertices_size_type Size;

std::vector<Size> dtime(num_vertices(g));
Size time = 0;

breadth_first_search(g, s, visitor(make_bfs_visitor(
stamp_times(dtime.begin(), time, on_discover_vertex()))));

(Я получил более менее ту же ошибку с этим кодом).

Мне нужно использовать двух посетителей, одного для записи предшественников, а второго — два, чтобы получить время посещения.

boost::breadth_first_search
(g, s,
boost::visitor(boost::make_bfs_visitor
(std::make_pair(
boost::record_predecessors(&p[0], boost::on_tree_edge()),
stamp_times(dtime.begin(), time, on_discover_vertex())))));

Но это событие кода не компилируется. Я получаю следующую ошибку.

/usr/include/boost/graph/visitors.hpp: In member function ‘void boost::time_stamper<TimeMap, TimeT, Tag>::operator()(Vertex, const Graph&) [with Vertex = long unsigned int, Graph = boost::adjacency_list<boost::vecS, boost::vecS, boost::undirectedS>, TimeMap = __gnu_cxx::__normal_iterator<long unsigned int*, std::vector<long unsigned int> >, TimeT = long unsigned int, Tag = boost::on_discover_vertex]’:
/usr/include/boost/graph/visitors.hpp:109:8:   instantiated from ‘void boost::detail::invoke_dispatch(Visitor&, T, Graph&, mpl_::true_) [with Visitor = boost::time_stamper<__gnu_cxx::__normal_iterator<long unsigned int*, std::vector<long unsigned int> >, long unsigned int, boost::on_discover_vertex>, T = long unsigned int, Graph = const boost::adjacency_list<boost::vecS, boost::vecS, boost::undirectedS>, mpl_::true_ = mpl_::bool_<true>]’
/usr/include/boost/graph/visitors.hpp:140:5:   instantiated from ‘void boost::invoke_visitors(Visitor&, T, Graph&, Tag) [with Visitor = boost::time_stamper<__gnu_cxx::__normal_iterator<long unsigned int*, std::vector<long unsigned int> >, long unsigned int, boost::on_discover_vertex>, T = long unsigned int, Graph = const boost::adjacency_list<boost::vecS, boost::vecS, boost::undirectedS>, Tag = boost::on_discover_vertex]’

2

Решение

stamp_times (и другие EventVisitors) ожидает WritablePropertyMap. В соответствии с этот Есть специализации property_traits которые позволяют использовать указатели c ++ в качестве карт свойств и в соответствии с этот «Поскольку итератор std :: vector (полученный с помощью вызова begin ()) является указателем, метод карты свойств указателя также работает для std :: vector :: iterator». Очевидно, эта последняя часть не соответствует последним версиям g ++ (проверено на 4.6.3 и 4.7.1). Итак, чтобы вызвать stamp_times вам нужно использовать &dtime[0] вместо dtime.begin(),

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]