2010-02-11 15 views
30

Szukam sposobu dostępu do właściwości wierzchołków za pomocą klucza zamiast samego odwołania do wierzchołków. Na przykład, jeśli mamZnajdź Podnieś wierzchołek BGL za pomocą klucza

class Data 
{ 
    public: 
    std::string name; 
    unsigned int value; 
}; 
typedef boost::adjacency_list< boost::vecS, boost::vecS, boost::directedS, Data > Graph; 
typedef boost::graph_traits<Graph>::vertex_descriptor Vertex; 

zamiast korzystania

Vertex vertex1 = boost::add_vertex(g); 
g[vertex1].name = "Alpha"; 
g[vertex1].value = 10; 

chciałbym mieć

g["Alpha"].name = "Alpha"; 
g["Alpha"].value = 10; 

Czy to gotowa do użycia mechanizm istnieje?

Odpowiedz

31

Myślę, że znalazłem taki mechanizm. Nazywa się labeled_graph i jest częścią BGL. Zamiast adjacency_list można zastosować predefiniowane owijka labeled_graph:

typedef boost::labeled_graph< 
    boost::adjacency_list< boost::vecS, boost::vecS, boost::directedS, Data >, 
    std::string 
> Graph; 

Po określeniu wykres w ten sposób, że możliwy jest dostęp do wierzchołków w następujący sposób:

Graph g; 

boost::add_vertex("Alpha", g); 
g["Alpha"].name = "Alpha"; 
g["Alpha"].value = 10; 

boost::add_vertex("Beta", g); 
g["Beta"].name = "Beta"; 
g["Beta"].value = 20; 

boost::add_edge_by_label("Alpha", "Beta", g); 

Efektem ubocznym tego jest to, że trzeba użyć funkcji składowej graph(), aby niektóre algorytmy działały:

std::vector<Graph::vertex_descriptor> container; 
boost::topological_sort(g.graph(), std::back_inserter(container)) ; 

Z jakiegoś powodu labeled_graph nie jest opisane w dokumentacji BGL, ale pojawia się w folderze przykładowym.

Dziękuję za odpowiedź, Serge

+0

Patrząc na historię adaptera labeled_graph.hpp, wygląda na to, że plik jest stosunkowo nowy. (Zaczęło pojawiać się w bibliotece Boost w wersji 1.40). Prawdopodobnie dlatego nie jest jeszcze częścią dokumentacji, –

1

Gotowy do użycia mechanizm nie istnieje, ponieważ pojęcie adjacency_list nie może wiedzieć, że chcesz uzyskać dostęp do właściwości vertex przez pole w strukturze.

Wolałbym sposób posiadania dodatkowej mapy, która odwzorowuje nazwę danych na odpowiedni wierzchołek. Co więcej, możesz hermetyzować swój algorytm w klasie lub funkcji, tak aby przy dodawaniu nowego wierzchołka mapa była wypełniana automatycznie.

Powiązane problemy