Boost Graph边缘的简单点输出,标有基本类型

时间:2015-04-21 22:52:21

标签: c++ boost graphviz boost-graph

在Boost Graph Library中使用捆绑属性意味着创建代码以输出与graphviz兼容的点文件非常简单:

#include <boost/graph/graphviz.hpp>

struct Edge { int i; };

int main()
{
  using namespace boost;
  typedef adjacency_list<vecS, vecS, directedS, no_property, Edge> Graph;
  Graph g;
  add_edge(0, 1, {123}, g);
  write_graphviz(std::cout, g, default_writer(),
                   make_label_writer(boost::get(&Edge::i,g)));
  return 0;
}

在上面的代码中,edge属性是使用名为Edge的结构定义的。这个结构只包含一个int; boost::get然后make_label_writer提供必要的PropertyWriter

如果我想改为使用基本类型(例如intdouble)作为edge属性,那么我现在需要传递给make_label_writer的参数是什么?代码可以保持与上面的代码相当。例如,adjacency_list可以声明为:

typedef adjacency_list<vecS, vecS, directedS, no_property, int> Graph;

1 个答案:

答案 0 :(得分:3)

您可以直接寻址边缘捆绑包。

  

对于捆绑属性,指向成员的指针属性标记隐式应用于edge_bundle_t属性(或vertex_bundle_tgraph_bundle_t的值情况可能是;因此,您不希望对边/顶点/图形包使用相同的用户定义类型。)

<强> Live On Coliru

#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/graphviz.hpp>

int main()
{
    using namespace boost;
    typedef adjacency_list<vecS, vecS, directedS, no_property, int> Graph;
    Graph g;
    add_edge(0, 1, 123, g);
    write_graphviz(std::cout, g, default_writer(), 
            make_label_writer(boost::get(edge_bundle,g)));
}

输出:

digraph G {
0;
1;
0->1 [label=123];
}