2012-06-30 1 views
5

Desidero che tutti i bordi abbiano proprietà, peso e capacità. Ho trovato che BGL ha già entrambi questi definiti. Così mi definisco proprietà EDGE e Vertex per il graficoBGL Aggiunta di un bordo con più proprietà

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; 

qui è dove sto cercando di aggiungere i bordi al grafico:

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

Se ho avuto solo 1 proprietà So che sarebbe prop = 5; Tuttavia, con due sono confuso circa la formattazione.

Qui è l'errore che sto ricevendo:

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

risposta

5

Se si guarda alla realizzazione di boost::property vedrai che un valore di proprietà non può essere inizializzato in questo modo. E anche allora, la sintassi che hai (weight, capacity) non è comunque valida, quindi, se fosse possibile inizializzare la proprietà in quel modo, sarebbe scritta EdgeProperty prop = EdgeProperty(weight, capacity); o solo EdgeProperty prop(weight, capacity);. Ma, ancora, non funzionerà. Tecnicamente, questo è il modo in cui si avrebbe bisogno di inizializzare il valore della proprietà:

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

Ma questo è una specie di brutto come il numero di proprietà aumentano. Quindi, sarebbe più pulito di default-costruire il bordo-proprietà e quindi impostare manualmente ogni singola proprietà:

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

Naturalmente, l'alternativa migliore è quello di utilizzare le proprietà in bundle al posto delle catene boost :: vecchia proprietà.

+0

si potrebbe dare un esempio per le proprietà in bundle di ultima biblioteca grafico spinta? –

0

La forma corretta è:

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