2009-10-02 14 views
5

¿Cómo debo modificar las propiedades empaquetadas de un vértice desde el interior de un visitante?Modificación de propiedades agrupadas del visitante

Me gustaría utilizar el método simple de subescribir el gráfico, pero el parámetro del gráfico pasado al visitante es const, por lo que el compilador no permite cambios.

Puedo almacenar una referencia al gráfico en el visitante, pero esto parece extraño.

/** 

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

Respuesta

4

Su solución es la correcta.

Para desacoplar el tipo de gráfico del visitante, puede pasar solo el mapa de la propiedad interesante al constructor del visitante y acceder a sus elementos usando boost::get(property, u) = s3d::cV::leaf;. De esta forma, puede pasar cualquier propiedad de vértice compatible con el tipo al visitante (el visitante será más general y no sensible a los cambios de nombre en el tipo de gráfico).

El tipo para el mapa característica será un tipo nombre de la plantilla para la clase de visitantes y habrá algo como:

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

Ver here para una disertación completa sobre las propiedades del paquete.

HTH

0

Estoy aprendiendo esto, pero creo que es correcto que almacene una referencia al gráfico en el visitante. No estoy seguro de si es por esta razón, pero puede ser porque no deseaban proporcionar dos versiones de todas las funciones/require derivadas para proporcionar dos versiones de cada función. Especialmente cuando el pase en la solución gráfica está disponible.

Incluso si se siente raro, creo que pasar una referencia al gráfico puede ser la "manera correcta".

+0

Estoy empezando a pensar que la referencia debe ser el camino. Supuse que estaba pasando por alto algo simple, pero como nadie ha sugerido nada más hasta el momento ... – ravenspoint

Cuestiones relacionadas