Увеличить графическую библиотеку и посетителей - PullRequest
4 голосов
/ 14 июля 2009

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

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

Ответы [ 3 ]

6 голосов
/ 14 июля 2009

Что вы имеете в виду, вы не можете разделить вершины на подклассы? Вы можете использовать свой собственный класс вершин, просто укажите его в графе 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] должен возвращать ссылку на Vertex, например ::

//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, использующую связанные свойства с использованием указателя на член.

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

4 голосов
/ 02 октября 2009

Если кому-то все равно, через 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);
    }
};

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

0 голосов
/ 14 июля 2009

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

...