BGL添加具有多个属性的边

时间:2012-06-30 21:29:57

标签: c++ boost boost-graph

我希望所有边缘都具有属性,重量和容量。我发现BGL已经定义了这两个。所以我为Graph

定义了Edge和Vertex属性
 typedef property<vertex_name_t, string> VertexProperty;
 typedef property<edge_weight_t, int, property<edge_capacity_t, int> > EdgeProperty;
 typedef adjacency_list<listS,vecS, undirectedS, VertexProperty, EdgeProperty > Graph;

以下是我尝试将边添加到图表的位置:

172: EdgeProperty prop = (weight, capacity);
173: add_edge(vertex1,vertex2, prop, g);

如果我只有一个属性,我知道它将是prop = 5;然而,有两个我对格式化感到困惑。

以下是我收到的错误:

graph.cc: In function ‘void con_graph()’:
graph.cc:172: warning: left-hand operand of comma has no effect

2 个答案:

答案 0 :(得分:7)

如果查看boost::property的实现,您会发现无法以这种方式初始化属性值。即便如此,您拥有(weight, capacity)的语法无论如何都是无效的,因此,如果可以像这样初始化属性,那么它将被写为EdgeProperty prop = EdgeProperty(weight, capacity);或仅EdgeProperty prop(weight, capacity);。但是,再说一遍,那是行不通的。从技术上讲,这是初始化属性值所需的方式:

EdgeProperty prop = EdgeProperty(weight, property<edge_capacity_t, int>(capacity));

但随着物业数量的增加,这有点难看。因此,默认构造edge-property然后手动设置每个单独的属性会更简洁:

EdgeProperty prop;
get_property_value(prop, edge_weight_t) = weight;
get_property_value(prop, edge_capacity_t) = capacity;

当然,更好的选择是使用捆绑属性而不是旧的boost :: property链。

答案 1 :(得分:0)

正确的形式是:

EdgeProperty prop;
get_property_value(prop, edge_weight) = weight;
get_property_value(prop, edge_capacity) = capacity;