グラフのエッジを繰り返し処理し、各エッジの重みを調べる必要があります。エッジを変更していないため、関数はグラフへの const 参照を取ります。ただし、エッジの重みを取得する唯一の方法は、const-ness に違反しているように見えるプロパティ マップにアクセスすることです。
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;
}
}
だから私はこれをしなければなりません:
Graph& trust_me = const_cast<Graph&>(graph);
WeightMap weights = boost::get(boost::edge_weight_t(), trust_me);
これを回避する方法はありますか?
余談ですが、プロパティ マップのルックアップは一定の時間になりますか?
参考までに、ここに私のグラフの定義を示します。
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;
ありがとう!