如何使用Boost Graph Library获取边缘的端口标识符?

时间:2011-03-06 05:00:08

标签: c++ boost graphviz boost-graph

使用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;
}

Rendering of digraph G

1 个答案:

答案 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。我没有测试过这个,但看起来所有的管道都在那里。