2011-10-31 3 views
5

J'ai commencé à utiliser le BGL pour certaines tâches liées au graphe. J'ai un grand nombre de bords et chaque bord a plusieurs propriétés, dont l'un est son poids. (Toutes les propriétés sont floats et ints). Comme je n'ai jamais travaillé avec le BGL (et/ou des bibliothèques CPP similaires) auparavant, je suis un peu perdu avec tous ces types, classes et comment l'utiliser correctement.Propriétés personnalisées pour les arêtes dans le BGL

ajouter mes bords comme ceci:

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

, je dois alors accéder à mon bien plus tard, ce que je suis en train de faire comme ceci:

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

Cependant, cela ne même compiler. Il est dit dans le message d'erreur:

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

entre autres erreurs, que je considère moins important en ce moment. Je ne sais pas si c'est ainsi que vous utiliseriez les propriétés personnalisées. Pourriez-vous s'il vous plaît m'expliquer le message d'erreur kind et comment utiliser les propriétés personnalisées? Je n'ai trouvé aucune documentation (que je comprenne) sur ce sujet.

Répondre

4

Jetez un oeil à ce code, je crois qu'il explique quelques choses de son propre:

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

Vous devez lire sur les concepts que BGL est basée sur.

De cette façon, vous pouvez accrocher n'importe quel type de valeur sur le bord (et de même pour le vertex). Vous pouvez également utiliser les types prédéfinis de propriétés, comme edge_weight_t ou edge_name_t je crois.

Voir aussi documentation BGL sur custom edge properties.

+0

Ce lien m'a beaucoup aidé. Merci! – janoliver

Questions connexes