2011-10-31 14 views
5

Empecé a usar BGL para algunas tareas relacionadas con gráficos. Tengo una gran cantidad de bordes y cada borde tiene varias propiedades, una de las cuales es su peso. (Todas las propiedades son flotantes y ints). Como nunca antes trabajé con BGL (y/o bibliotecas de CPP similares), estoy un poco perdido con todos estos tipos, clases y cómo usarlo correctamente.propiedades personalizadas para bordes en BGL

añado mis bordes de esta manera:

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

Entonces, necesito acceder a mi propiedad más tarde, lo que estoy tratando de hacer como esto:

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

Sin embargo, esto no lo hace incluso compilar. Se dice en el mensaje de error:

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

entre otros errores, que considero menos importante en este momento. No sé si así es como usaría propiedades personalizadas. ¿Podría explicarme el mensaje de error kind y cómo usar propiedades personalizadas? No pude encontrar ninguna documentación (que entiendo) sobre este tema.

Respuesta

4

Tome un vistazo a este código, creo que explica algunas cosas de su propia:

#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; 
} 

que necesita para leer acerca de los conceptos que se basa en BGL.

De esta manera puede colgar cualquier tipo de valor fuera del borde (y de manera similar para el vértice). También puede usar los tipos predefinidos de propiedades, como edge_weight_t o edge_name_t, creo.

Consulte también los documentos de BGL sobre custom edge properties.

+0

Ese enlace me ayudó mucho. ¡Gracias! – janoliver

Cuestiones relacionadas