6

グラフのエッジを繰り返し処理し、各エッジの重みを調べる必要があります。エッジを変更していないため、関数はグラフへの 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;

ありがとう!

4

1 に答える 1

5

今後の参考のために、見つけました。これはうまくいきません

const boost::property_map<Graph, boost::edge_weight_t>::type

しかし、property_map は const_type を定義します

boost::property_map<Graph, boost::edge_weight_t>::const_type

get() のドキュメントは次のページにあります: http://www.boost.org/doc/libs/1_51_0/libs/graph/doc/adjacency_list.html

于 2012-09-21T21:33:45.170 に答える