2013-10-07 1 views
3

У меня есть направленный мультиграф с вершинами 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?

ответ

1

Об этой ошибке сообщалось ранее на Boost mailinglist.

it fails to compile when the Directed Selector template argument to adjacency_list is set to directedS, but does work if the argument is either undirectedS, or bidirectionalS. Attached below is a short program illustrating the problem. The problem is that edge_range() instantiates a StoredEdge via a constructor taking 3 arguments, but when the Directed Selector is directedS StoredEdge is typedef'ed to stored_edge_property, which has no such constructor. One solution might be to create overloaded edge_range_dispatch() functions, and dispatch on
Config::on_edge_storage.

Изменение directedS к undirectedS в программе работ. Live Example. Но это может быть не то, что вам нужно для вашего приложения, поэтому простой фильтр, о котором вы говорили ранее, может быть лучше. Вы можете перепечатать это в списке рассылки Boost, чтобы привлечь к себе больше внимания.

+0

Я пробовал неориентированный граф. Результат был очень интересным в контексте моей заявки. – nurettin

+0

это очень плохо, я могу понять досаду. Вам обязательно нужно связаться с автором библиотеки или с почтовым списком Boost. Это может быть успешным, если вы также попытались реализовать предложение отдельной перегрузки '_dispatch()' и отправили исправление ошибки. – TemplateRex

+1

Теперь это должно быть исправлено в стволе Boost с номера r86469. Отправка отчетов об ошибках в список рассылки для оптимизаторов или их хранение по адресу https://svn.boost.org/trac/boost ускорит получение исправлений для этой проблемы в будущем. –

 Смежные вопросы

  • Нет связанных вопросов^_^