在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
。
如果我想改为使用基本类型(例如int
或double
)作为edge属性,那么我现在需要传递给make_label_writer
的参数是什么?代码可以保持与上面的代码相当。例如,adjacency_list
可以声明为:
typedef adjacency_list<vecS, vecS, directedS, no_property, int> Graph;
答案 0 :(得分:3)
您可以直接寻址边缘捆绑包。
对于捆绑属性,指向成员的指针属性标记隐式应用于
edge_bundle_t
属性(或vertex_bundle_t
或graph_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];
}