У меня есть направленный мультиграф с вершинами A..C и ребрами E1..E4подталкивания библиотеки граф направленного мультиграфа edge_range ошибка
A ---E1--> B
A ---E2--> B
A ---E3--> B
B ---E4--> C
Я хотел перебрать ребра, соединяющих А и В.
в BGL, я выразил это так:
#include <boost/graph/adjacency_list.hpp>
struct Vertex
{
std::string code;
};
struct Edge
{
double distance;
std::string code;
};
int main()
{
using namespace boost;
typedef adjacency_list<listS, vecS, directedS, Vertex, Edge> Graph;
Graph g;
auto a= add_vertex(Vertex{ "A" }, g);
auto b= add_vertex(Vertex{ "B" }, g);
auto c= add_vertex(Vertex{ "C" }, g);
add_edge(a, b, Edge{ 10, "E1" }, g);
add_edge(a, b, Edge{ 10, "E2" }, g);
add_edge(a, b, Edge{ 10, "E3" }, g);
add_edge(a, c, Edge{ 10, "E4" }, g);
// checking number of edges
std::cout<< num_edges(g)<< std::endl;
// printing edges branching from A
auto erange= out_edges(a, g);
for(auto i= erange.first; i!= erange.second; ++ i)
std::cout<< g[*i].code<< std::endl;
// now we want to iterate over edges that connect A and B
auto wtf= boost::edge_range(a, b, g);
}
Что приводит к ошибке компиляции:
In file included from /usr/include/boost/graph/adjacency_list.hpp:246:
/usr/include/boost/graph/detail/adjacency_list.hpp:1617:25: error: no matching constructor for initialization of 'StoredEdge' (aka
'boost::detail::stored_edge_property<unsigned long, Edge>')
equal_range(el, StoredEdge(v, fake_edge_container.end(),
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Я прочитал документацию:
std::pair<out_edge_iterator, out_edge_iterator> edge_range(vertex_descriptor u, vertex_descriptor v, const adjacency_list& g) Returns a pair of out-edge iterators that give the range for all the parallel edges from u to v. This function only works when the OutEdgeList for the adjacency_list is a container that sorts the out edges according to target vertex, and allows for parallel edges. The multisetS selector chooses such a container.
(http://www.boost.org/doc/libs/1_54_0/libs/graph/doc/adjacency_list.html)
Измененный график:
typedef adjacency_list<multisetS, vecS, directedS, Vertex, Edge> Graph;
Но ошибка не изменилась.
Итак, как вы можете перечислить ребра между двумя вершинами (от-> до) в направленном мультиграфе с использованием BGL?
Я нашел быстрый и грязный путь:
auto erange= out_edges(a, g);$
for(auto i= erange.first; i!= erange.second; ++ i)$
std::cout<< g[*i].code<< " -> "<< g[target(*i, g)].code<< std::endl;$
который позволит мне фильтровать края по целевой вершине. Но как вы используете boost::edge_range
?
Я пробовал неориентированный граф. Результат был очень интересным в контексте моей заявки. – nurettin
это очень плохо, я могу понять досаду. Вам обязательно нужно связаться с автором библиотеки или с почтовым списком Boost. Это может быть успешным, если вы также попытались реализовать предложение отдельной перегрузки '_dispatch()' и отправили исправление ошибки. – TemplateRex
Теперь это должно быть исправлено в стволе Boost с номера r86469. Отправка отчетов об ошибках в список рассылки для оптимизаторов или их хранение по адресу https://svn.boost.org/trac/boost ускорит получение исправлений для этой проблемы в будущем. –