我想打印一个包含自定义(字符串)顶点标签的Boost Graph,而不是默认的顶点编号标签0,1,2 ......
我已将图初始化为:
typedef adjacency_list <vecS, vecS, directedS,
property<vertex_name_t,string>
> Graph;
Graph g;
set<string> names;
map<string,Graph::vertex_descriptor> vertex ;
for(auto it = names.begin() ; it != names.end(); ++it )
vertex[*it] = add_vertex(*it,g) ;
现在我应该如何打印此图表,以便获得格式abc -> xyz;
的边缘,而不是1->2;
答案 0 :(得分:4)
你可以从顶点描述符中get
命名,例如
graph_traits<Graph>::edge_iterator it, end;
for(tie(it, end) = edges(g); it != end; ++it)
std::cout << get(vertex_name, g)[source(*it, g)] << " -> "
<< get(vertex_name, g)[target(*it, g)] << '\n';
答案 1 :(得分:1)
我不是一个真正精通的BGL用户,但我发现你的方法存在一些问题:
1)您似乎在声明内部属性vertex_name
,但后来使用外部存储空间set<string>
?
2)独立于此,我没有看到任何实际填充名称的代码,无论是内部还是外部情况 - 但我认为为简洁起见,您只是省略了它。
但是现在提出一个解决方案:BGL实际上有一种方法可以做你想做的事:boost::print_graph
:
using namespace boost;
typedef adjacency_list <vecS, vecS, directedS,
property<vertex_name_t,string>
> Graph;
Graph g;
std::set<string> names;
// somehow populating names here...
// creating the vertices and storing the names as internal properties
for(auto it = names.begin() ; it != names.end(); ++it )
{
auto v = add_vertex(g);
put(vertex_name,g,/*vertex descriptor*/ *v,/*vertex name*/ *it);
}
print_graph(g,get(vertex_name,g)); //NOTE: you could also use an external property map or an adaptor