使用Boost Graph Library,是否可以获取边缘的端口标识符?
示例:调用read_graphviz
后,我可以遍历此图的边缘并打印他们的node_id
- 我得到“A - > B,A - > B”。如何打印“A:p0 - > B:p1,A:p0 - > B:p2”之类的内容?
digraph G {
A [label="A|<p0>p0"];
B [label="B|<p1>p1|<p2>p2"];
A:p0 -> B:p1;
A:p0 -> B:p2;
}
答案 0 :(得分:4)
来自read_graphviz_new.hpp
来源:
struct edge_info {
node_and_port source;
node_and_port target;
properties props;
};
node_and_port
看起来像这样:
struct node_and_port {
node_name name;
std::string angle; // Or empty if no angle
std::vector<std::string> location; // Up to two identifiers
// ...
}
我认为(但尚未验证)如果直接使用以下方法调用解析器,则可以使用这些结果:
void parse_graphviz_from_string(const std::string& str, parser_result& result, bool want_directed);
命名空间boost::read_graphviz_detail
中的。如果您直接使用dynamic_property_map
,它也可能会在read_graphviz
中提供;它在内部指的是read_graphviz_new
。
注意:在graphviz.hpp
中,根据#ifdef
选择了两个graphviz解析器中的一个:
#ifdef BOOST_GRAPH_USE_SPIRIT_PARSER
return read_graphviz_spirit(data.begin(), data.end(), graph, dp, node_id);
#else // Non-Spirit parser
return read_graphviz_new(data,graph,dp,node_id);
#endif
如果我正确阅读,那么非精神解析器就是你想要的;基于精神的一个看起来像是无视港口。
无论如何,这只是基于快速查看boost v.1.44的来源;对我而言,感兴趣的代码存在于/usr/include/boost/graph/detail/read_graphviz_new.hpp
。我没有测试过这个,但看起来所有的管道都在那里。