2009-10-02 13 views
5

Jak zmodyfikować właściwości wiązanego wierzchołka wewnątrz obiektu odwiedzającego?Modyfikowanie właściwości wiązanych przez odwiedzającego

Chciałbym użyć prostej metody podkatalogowania wykresu, ale parametr graficzny przekazany do użytkownika to const, więc kompilator nie dopuszcza zmian.

Mogę zapisać odniesienie do wykresu na stronie, ale wydaje się to dziwne.

/** 

    A visitor which identifies vertices as leafs or trees 

*/ 
class bfs_vis_leaf_finder:public default_bfs_visitor { 

public: 
    /** 

    Constructor 

    @param[in] total reference to int variable to store total number of leaves 
    @param[in] g reference to graph (used to modify bundled properties) 

    */ 
    bfs_vis_leaf_finder(int& total, graph_t& g) : 
     myTotal(total), myGraph(g) 
     { 
      myTotal = 0; 
     } 

    /** 

    Called when the search finds a new vertex 

    If the vertex has no children, it is a leaf and the total leaf count is incremented 

    */ 
    template <typename Vertex, typename Graph> 
    void discover_vertex(Vertex u, Graph& g) 
    { 
     if(out_edges(u, g).first == out_edges(u, g).second) { 
      myTotal++; 
      //g[u].myLevel = s3d::cV::leaf; 
      myGraph[u].myLevel = s3d::cV::leaf; 
     } else { 
      //g[u].myLevel = s3d::cV::tree; 
      myGraph[u].myLevel = s3d::cV::tree; 
     } 
    } 

    int& myTotal; 
    graph_t& myGraph; 
}; 

Odpowiedz

4

Twoje rozwiązanie ma rację.

Aby oddzielić typ wykresu od odwiedzającego, można przekazać tylko interesującą mapę właściwości konstruktorowi odwiedzającego i uzyskać dostęp do jego elementów za pomocą boost::get(property, u) = s3d::cV::leaf;. W ten sposób możesz przekazać odwiedzającym dowolną właściwość wierzchołków zgodną z typem (użytkownik będzie bardziej ogólny i nie będzie rozsądny, aby wymienić zmiany w typie wykresu).

typ na mapie nieruchomości będzie szablon typu nazwa dla klasy zwiedzających i będzie coś takiego:

typedef property_map<graph_t, s3d_cv3_leaf_t your_vertex_info::*>::type your_property_map; 

Zobacz here Pełną dysertacji o wiązanych właściwości.

HTH

0

Właśnie uczę się tych rzeczy, ale myślę, że prawdą jest, że trzeba przechowywać odniesienie do wykresu w odwiedzającego. Nie jestem pewien, czy to z tego powodu, ale być może dlatego, że nie chcieli dostarczyć dwóch wersji wszystkich funkcji/wymagają pochodnych, aby zapewnić dwie wersje każdej funkcji. Zwłaszcza, gdy dostępne jest obejście na wykresie.

Nawet jeśli wydaje się dziwne, myślę, że podanie odniesienia do wykresu może być "właściwą drogą".

+0

Zaczynam myśleć, że odniesienie musi być właściwą drogą. Sądziłem, że przeoczyłem coś prostego, ale ponieważ nikt nie sugerował niczego więcej ... – ravenspoint

Powiązane problemy