Я ищу способ получить доступ к свойствам вершины при помощи ключа вместо самой ссылки вершины. Например, если я имею
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;
Готовое для использования механизма существуют?
Кажется, я нашел такой механизм. Он называется labeled_graph и является частью BGL. Вместо использования adjacency_list можно использовать предопределенную обертку labeled_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 ) ) ;
По какой-то причине labeled_graph не описан в документации BGL, но он появляется в папке примеров.
Спасибо за ответ, Serge
Готового к использованию механизма не существует, поскольку концепция adjacency_list
не может знать, что вы хотите получить доступ к свойству вершины по полю в struct.
Я бы предпочел способ с дополнительной картой, которая сопоставляет имя данных с соответствующей вершиной. Далее, вы можете заключить свой алгоритм в класс или функцию, чтобы при добавлении новой вершины карта заполнялась автоматически.