2012-09-19 13 views
5

Ho bisogno di scorrere i bordi di un grafico ed esaminare il peso di ciascun bordo. Non sto modificando i bordi, quindi la mia funzione prende un riferimento const a un grafico. Tuttavia, l'unico modo che conosco per ottenere i pesi è quello di ottenere l'accesso alla mappa delle proprietà, che sembra violare costanza.Iterazione dei contorni di un impulso const: grafico

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

Quindi devo fare questo:

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

C'è un modo per evitare questo?

In una nota a margine, le ricerche della mappa delle proprietà saranno costanti?

Per riferimento, ecco la mia definizione di grafico.

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; 

Grazie!

risposta