Вопрос

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

class Data
{
  public:
    std::string  name;
    unsigned int value; 
}; 
typedef boost::adjacency_list< boost::vecS, boost::vecS, boost::directedS, Data > Graph;
typedef boost::graph_traits<Graph>::vertex_descriptor Vertex;

вместо использования

Vertex vertex1 = boost::add_vertex( g );
g[vertex1].name  = "Alpha";
g[vertex1].value = 10;

Я бы хотел

g["Alpha"].name  = "Alpha";
g["Alpha"].value = 10;

Существует ли готовый механизм?

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

Решение

Я думаю, что нашел такой механизм. Это называется laked_graph и является частью BGL. Вместо использования Прилегающий_лист, можно использовать предопределенную обертку laked_graph:

typedef boost::labeled_graph<
    boost::adjacency_list< boost::vecS, boost::vecS, boost::directedS, Data >,
    std::string
> Graph;

После определения такого графика можно получить доступ к вершинам следующим образом:

Graph g;

boost::add_vertex( "Alpha", g );
g["Alpha"].name  = "Alpha";
g["Alpha"].value = 10;

boost::add_vertex( "Beta", g );
g["Beta"].name  = "Beta";
g["Beta"].value = 20;

boost::add_edge_by_label( "Alpha", "Beta", g );

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

std::vector< Graph::vertex_descriptor > container;
boost::topological_sort( g.graph(), std::back_inserter( container ) ) ;

По какой -то причине, laked_graph не описан в документации BGL, но она появляется в папке примера.

Спасибо за ответ, Серж

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

Готовый к использованию механизм не существует, так как adjacency_list Концепция не может знать что вы хотите получить доступ к своей собственности Vertex по полю в структуре.

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

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