【问题标题】:Iterating through edge weights of a const boost::graph遍历 const boost::graph 的边权重
【发布时间】:2012-09-19 19:02:18
【问题描述】:

我需要遍历图的边缘并检查每条边缘的权重。我没有修改边缘,因此我的函数需要对图形进行 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);

有没有办法避免这种情况?

顺便说一句,属性映射查找是否会是常数时间?

作为参考,这是我对 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;

谢谢!

【问题讨论】:

    标签: c++ boost-graph


    【解决方案1】:

    为了将来参考,我找到了它。这行不通

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多