Увеличьте библиотеку графиков и посетителей

StackOverflow https://stackoverflow.com/questions/1123115

  •  13-09-2019
  •  | 
  •  

Вопрос

Я пишу библиотеку для работы с графиками бонда, и я использую библиотеку Boost Graph для хранения данных для себя.К сожалению, я, кажется, не могу понять, как реализовать правильный шаблон visitor, используя его, поскольку вы не можете создавать подклассы из вершин - вместо этого вы должны полагаться на "свойства".Платформа visitor, представленная в библиотеке, похоже, в значительной степени ориентирована на работу с определенными алгоритмами, где все вершины одного типа, но хранят разную информацию.В моей задаче вершины имеют разные типы и хранят разные типы информации - некоторые вершины являются резисторами, в то время как некоторые являются конденсаторами и т.д.Как мне приступить к написанию шаблона посетителя, который работает на основе свойства вершины, а не самой вершины?

Моей единственной мыслью до сих пор было написать небольшой класс для представления типа объекта, который указывает обратно на исходную вершину, которая мне нужна для получения информации о графике.Тем не менее, это кажется очень запутанным и злым для работы.

Это было полезно?

Решение

Что вы имеете в виду, говоря, что вы не можете создавать подклассы из вершин?Вы можете использовать свой собственный класс vertex , это просто вопрос указания его в Graph typedef .Вы даже можете использовать элементы в качестве свойств при работе с алгоритмами BGL.

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

Редактировать:Вы указываете классы вершин / ребер при определении типа вашего графика:

struct Vertex {
    double some_property;
};

struct Edge {
    double weight;
};

typedef boost::adjacency_list<
    boost::listS, boost::vecS, boost::undirectedS, Vertex, Edge
> Graph; //sorry about the formatting

Graph g;

Откуда в g[vertex_descriptor] должна возвращаться ссылка на Вершину, например:

//add 100 vertices
for (int i=0; i<100; ++i) {
    Graph::vertex_descriptor v = add_vertex(g);
    g[v].some_property = -1.0;
}

//zero some_property for all vertices
for (Graph::vertex_iterator i = vertices(g).first;
                            i != vertices(g).second;
                            ++i)
{
    g[*i].some_property = 0.0;
}

Я не смог найти свой код посетителя, использующий эти свойства, но я нашел соответствующую часть документации BGL:

1) Часть о Внутренние свойства, который рекомендует вам использовать вместо:
2) Объединенные Свойства

Вторая ссылка, похоже, имеет функцию Boost, использующую связанные свойства с использованием указателя на элемент.

Помогает ли это?

Другие советы

Если кого-то это волнует, то через 2 месяца вот посетитель, который смотрит на недвижимость.

class demo_visitor : public default_bfs_visitor {
public:
    template <typename Vertex, typename Graph>
    void discover_vertex( Vertex u, Graph& g)
    {
        printf("Visited vertex %d with property %f\n",
            u, g[u].some_property);
    }
};

Если посетителю необходимо изменить свойства, то все немного усложняется.По вопросам - нажмите здесь

Может быть, вы могли бы использовать boost::variant для построения непересекающейся суммы типов вершин, затем объединить посетителя BGL с посетителем boost::variant в каждой вершине?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top