我正在寻找一种通过使用键而不是顶点引用本身来访问顶点属性的方法。 例如,如果我有
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;
是否存在现成的机制?
答案 0 :(得分:32)
我想我已经找到了这样的机制。它被称为labeled_graph,是BGL的一部分。 可以使用预定义的包装 labeled_graph ,而不是使用 adjacency_list :
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 ) ) ;
出于某种原因,BGL文档中没有描述 labeled_graph ,但它出现在示例文件夹中。
感谢您的回复, 哔叽
答案 1 :(得分:1)
现成的机制不存在,因为adjacency_list
概念不能知道你想要通过结构中的字段访问你的顶点属性。
我更喜欢使用附加地图的方式,该地图将数据名称映射到相应的顶点。此外,您可以将算法封装在类或函数中,以便在添加新顶点时自动填充地图。