首页 文章

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

提问于
浏览
3

使用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 回答

  • 3

    您将直接寻址边缘包 .

    对于捆绑属性,指向成员的属性标记隐式应用于edge_bundle_t属性的值(或者视情况而定为vertex_bundle_t或graph_bundle_t;因此,您不希望对边缘使用相同的用户定义类型/ vertex / graph bundle) .

    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];
    }
    

相关问题