Как получить доступ к свойствам ребер в библиотеке графов наддува - PullRequest
0 голосов
/ 30 ноября 2018

Я пытаюсь написать программу, которая оборачивает библиотеку графов буста, чтобы обеспечить удобный пользовательский интерфейс.Я очень новичок в бусте (и переполнении стека), но потратил довольно много времени на чтение документации буста.

Моя проблема в том, что всякий раз, когда я иду, чтобы получить карту свойств для моих свойств ребер,используя связанные свойства или внутренние свойства, я получаю сообщение об ошибке при вызове функции get() для свойства ребра, говоря, что не существует прототипа функции, соответствующего заданным аргументам.У меня нет трудностей, когда я делаю то же самое для своих свойств вершин.Более того, документация повышения, похоже, также указывает на то, что для свойств ребер нет функции get().Я думаю, что проблема может быть в моем конструкторе, который предназначен для чтения графической информации из текстового файла:

BGraph::BGraph()                                                           // constructor
{ 
    graph;          // is this how you would initialize the graph?
    //...input and initialization of vertices

    //...input of edge information

    auto e = add_edge(vertex1, vertex2, graph).first;                  // add the edge

    // this is the internal property version
    property_map<Graph, edge_weight_t>::type weightMap = get(edge_weight, graph);
                                    // ^^^^^ error here saying there is no such member
    weightMap[e] = inWeight;

    //graph[e].weight = inWeight;       this is the bundled version    // give the edge its weight

}

}

Вот мой заголовочный файл для класса оболочки:

#include <boost/config.hpp>
#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/graph_traits.hpp>
#include <boost/graph/adjacency_iterator.hpp>
#include <boost/graph/dijkstra_shortest_paths.hpp>
#include <boost/graph/kruskal_min_spanning_tree.hpp>
#include <boost/graph/named_function_params.hpp>
#include <boost/graph/properties.hpp>
#include <boost/property_map/property_map.hpp>
#include <boost/graph/graphviz.hpp>

#include <string>
#include <vector>
#include <iostream>

using namespace std;
using namespace boost;

class BGraph
{
public:

    struct Edge_Properties                                      // property bundle for edges
    {
        string name;
        int weight = 1;
    };

    struct Vertex_Properties                                    // property bundle for vertices
    {
        string name;
        int distance;
        int pred;
    };

    // class member functions...

    typedef adjacency_list<vecS, vecS, bidirectionalS,          // graph type
        Vertex_Properties, property<edge_weight_t, int> > Graph;

 /*typedef adjacency_list<vecS, vecS, bidirectionalS,           // graph type
    Vertex_Properties, Edge_Properties> Graph;*/                // this is the bundled version

    typedef property_map<Graph, vertex_index_t>::type IdMap;
    typedef typename graph_traits<Graph>::vertex_descriptor vertex_descriptor;
private:
    Graph graph;                                                // the boost graph
}

У меня похожие проблемы в моей функции для dijkstra_shortest_paths:

dijkstra_shortest_paths(graph, findVertex(startVertex), 
    predecessor_map(get(&Vertex_Properties::pred, graph))
    .distance_map(get(&Vertex_Properties::distance, graph))
    .weight_map(/*get(&Edge_Properties::weight, graph)*/ get(edge_weight, graph)));

Конкретная ошибка в функции get:

нет экземпляраперегруженной функции "get" соответствует списку аргументов.Типы аргументов: (boost:edge_weight_t, const BGraph::graph)

Мне кажется, что есть какое-то слишком простое решение, но я просто не смог его найти.Я использую MS Visual Studio 2017 и буст-версию boost_1_67_0.Я думаю, что проблема может быть связана с Visual Studio, в частности, потому что код, почти идентичный моему, кажется, работает для других людей.Спасибо за вашу помощь.

1 Ответ

0 голосов
/ 30 ноября 2018

Кажется, что ваш код должен работать для внутренних свойств.

При использовании связанных свойств необходимо указать PropertyTag для property_map в качестве указателя на элемент данных, в вашем случае указатель на weight член Edge_properties.

    property_map<Graph,int Edge_Properties::*>::type weightMap = 
                   get(&Edge_Properties::weight, graph);
                     //^^^^^
    auto e = add_edge(1, 2, graph).first;
    weightMap[e] = 10;
    graph[e].weight = 20;   

Здесь - примеры получения карты свойств из связанных свойств.Вы можете легко адаптировать их к вашим потребностям.

...