Увеличьте библиотеку графиков и посетителей
-
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 в каждой вершине?