通过关键字查找Boost BGL中的顶点

33
我正在寻找一种通过使用键而不是顶点引用本身来访问顶点属性的方法。 例如,如果我有:
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;

是否存在现成的机制可供使用?

2个回答

35
我认为我已经找到了这样的机制。它被称为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 ) ) ;

由于某些原因,labeled_graph在BGL文档中没有得到描述,但它出现在示例文件夹中。

谢谢您的回复, Serge


看一下 labeled_graph.hpp 适配器的历史记录,它似乎是比较新的文件(开始出现在 Boost 库版本 1.40 中)。可能这就是为什么它还不是文档的一部分的原因。 - Serge C

1

由于adjacency_list概念无法“知道”您想通过结构体中的字段访问顶点属性,因此不存在可直接使用的机制。

我更喜欢使用另外一个映射表,将数据的名称映射到相应的顶点上。此外,您可以将算法封装在类或函数中,以便在添加新顶点时自动填充映射表。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接