【问题标题】:Simple dot output for Boost Graph edges labelled with basic types用基本类型标记的 Boost Graph 边的简单点输出
【发布时间】:2015-04-21 22:52:20
【问题描述】:

将捆绑属性与 Boost 图形库一起使用意味着创建代码以输出与 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 的结构定义的。这个结构只包含一个intboost::get 然后为make_label_writer 提供必要的PropertyWriter

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

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

【问题讨论】:

  • 代码不应该编译,因为edge 是模棱两可的。修复了您的代码

标签: c++ boost graphviz boost-graph


【解决方案1】:

您将直接处理边缘包。

对于捆绑属性,pointer-to-member 属性标记隐式应用于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];
}

【讨论】:

  • 优秀。当你不知道它的名字时,很难谷歌 edge_bundle :)
猜你喜欢
  • 2010-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-01
相关资源
最近更新 更多