2011-10-31 14 views
5

Ho iniziato a utilizzare il BGL per alcune attività relative al grafico. Ho un gran numero di spigoli e ogni spigolo ha diverse proprietà, una delle quali è il suo peso. (Tutte le proprietà sono galleggianti e int). Dal momento che non ho mai lavorato con le librerie BGL (e/o simili CPP) prima, sono un po 'perso con tutti questi tipi, classi e come usarlo correttamente.proprietà personalizzate per i bordi nel BGL

aggiungo i miei bordi come questo:

struct EdgeProperty 
{ 
    int weight; 
    float e1; 
    float e2; 
}; 

typedef adjacency_list<vecS, vecS, bidirectionalS, no_property, EdgeProperty> Graph; 
... 
EdgeProperty prop; 
node1 = ...; 
node2 = ...; 
prop.e1 = ...; 
prop.e2 = ...; 
prop.weight = ...; 

add_edge(node1, node2, prop, g); 

Poi, ho bisogno di accedere alla mia proprietà in seguito, quello che sto cercando di fare in questo modo:

property_map<Graph, EdgeProperty>::type EdgeWeightMap = get(EdgeProperty, g); 
w = get(EdgeWeightMap,some_edge); 

Tuttavia, questo non lo fa anche compilare. Si dice nel messaggio di errore:

error: no type named ‘kind’ in ‘struct EdgeProperty’

tra altri errori, che ritengo meno importante in questo momento. Non so se questo è il modo in cui useresti le proprietà personalizzate. Potresti spiegarmi il messaggio di errore kind e come utilizzare le proprietà personalizzate? Non sono riuscito a trovare alcuna documentazione (che capisco) su questo argomento.

risposta

4

Date un'occhiata a questo codice, credo che spiega alcune cose della propria:

#include <boost/graph/adjacency_list.hpp> 
#include <boost/graph/properties.hpp> 
#include <iostream> 

namespace bgl = boost; 

struct EdgeInfo 
{ 
    int weight; 
    float e1; 
    float e2; 
}; 

struct EdgeInfoPropertyTag 
{ 
    typedef bgl::edge_property_tag kind; 
    static std::size_t const num; // ??? 
}; 

std::size_t const EdgeInfoPropertyTag::num = (std::size_t)&EdgeInfoPropertyTag::num; 

typedef bgl::property<EdgeInfoPropertyTag, EdgeInfo> edge_info_prop_type; 
typedef bgl::adjacency_list<bgl::vecS, bgl::vecS, bgl::bidirectionalS, 
    bgl::no_property, edge_info_prop_type> Graph; 
typedef bgl::graph_traits<Graph>::vertex_descriptor vertex_descr_type; 
typedef bgl::graph_traits<Graph>::edge_descriptor edge_descr_type; 

int 
main() 
{ 
    Graph g; 
    vertex_descr_type u, v; 
    u = add_vertex (g); 
    v = add_vertex (g); 
    EdgeInfo props; 
    props.weight = 3; 
    std::pair<edge_descr_type, bool> result = add_edge (u, v, props, g); 

    EdgeInfo p = get (EdgeInfoPropertyTag(), g, result.first); 
    std::cout << "weight: " << p.weight << std::endl; 
} 

è necessario leggere sui concetti che BGL si basa su.

In questo modo è possibile appendere qualsiasi tipo di valore fuori dal bordo (e similmente per il vertice). Potresti anche utilizzare i tipi predefiniti di proprietà, ad esempio edge_weight_t o edge_name_t.

Vedere anche documenti BGL a proposito di custom edge properties.

+0

Questo collegamento mi ha aiutato molto. Grazie! – janoliver

Problemi correlati