5

すべてのエッジにプロパティ、重量、容量を持たせたいです。BGLにはこれらの両方がすでに定義されていることがわかりました。そこで、グラフのエッジプロパティと頂点プロパティを定義します

 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);

プロパティが1つしかない場合は、prop=5になることがわかります。しかし、2つで私はフォーマットについて混乱しています。

これが私が受け取っているエラーです:

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

2 に答える 2

7

boost :: propertyの実装を見ると、プロパティ値をこの方法で初期化できないことがわかります。それでも、あなたが持っている構文は(weight, capacity)とにかく有効ではないので、そのようにプロパティを初期化することができれば、それは書かれるEdgeProperty prop = EdgeProperty(weight, capacity);か、または単にEdgeProperty prop(weight, capacity);。しかし、繰り返しになりますが、それは機能しません。技術的には、これはプロパティ値を初期化するために必要な方法です。

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

しかし、プロパティの数が増えるにつれて、これはちょっと醜いです。したがって、デフォルトでエッジプロパティを作成してから、個々のプロパティを手動で設定する方がクリーンです。

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

もちろん、より良い代替手段は、古いboost::propertyチェーンの代わりにバンドルされたプロパティを使用することです。

于 2012-07-01T00:11:50.393 に答える
0

正しい形式は次のとおりです。

EdgeProperty prop;
get_property_value(prop, edge_weight) = weight;
get_property_value(prop, edge_capacity) = capacity;
于 2015-07-14T11:29:25.823 に答える