2012-09-19 13 views
5

Necesito recorrer los bordes de un gráfico y examinar el peso de cada borde. No estoy modificando los bordes, por lo tanto, mi función toma una referencia constante a un gráfico. Sin embargo, la única manera que conozco de obtener los pesos de borde es obtener acceso al mapa de propiedades, que parece violar la const-ness.Iteración a través de los pesos de los bordes de un aumento de const :: gráfico

void printEdgeWeights(const Graph& graph) { 
    typedef Graph::edge_iterator EdgeIterator; 
    std::pair<EdgeIterator, EdgeIterator> edges = boost::edges(graph); 

    typedef boost::property_map<Graph, boost::edge_weight_t>::type WeightMap; 
    // The following line will not compile: 
    WeightMap weights = boost::get(boost::edge_weight_t(), graph); 

    EdgeIterator edge; 
    for (edge = edges.first; edge != edges.second; ++edge) { 
    std::cout << boost::get(weights, *edge) << std::endl; 
    } 
} 

Así que tengo que hacer esto:

Graph& trust_me = const_cast<Graph&>(graph); 
WeightMap weights = boost::get(boost::edge_weight_t(), trust_me); 

¿Hay una manera de evitar esto?

En una nota al margen, ¿las búsquedas del mapa de propiedad serán a tiempo constante?

Como referencia, aquí está mi definición de Graph.

struct FeatureIndex { ... }; 
typedef boost::property<boost::vertex_index_t, int, 
         FeatureIndex> 
     VertexProperty; 
typedef boost::property<boost::edge_index_t, int, 
     boost::property<boost::edge_weight_t, int> > 
     EdgeProperty; 
typedef boost::subgraph< 
      boost::adjacency_list<boost::vecS, 
           boost::vecS, 
           boost::undirectedS, 
           VertexProperty, 
           EdgeProperty> > 
     Graph; 

¡Gracias!

Respuesta

Cuestiones relacionadas