提升Djikstra类“boost :: property_map>没有成员”类型“

问题描述 投票:1回答:1

我一直在努力使用Boost框架实现Dijkstra的算法已有一段时间了,我似乎无法弄清楚我缺少的是什么。

使用在以下位置找到的示例:https://www.boost.org/doc/libs/1_67_0/libs/graph/doc/dijkstra_shortest_paths.html

我在第36行收到错误

property_map<graph_t, edge_weight_t>::type weightmap = get(edge_weight, g);

class "boost::property_map<boost::adjacency_list<boost::listS, boost::vecS, boost::directedS, boost::no_property, boost::property<boost::edge_weight_t, int, boost::no_property>, boost::no_property, boost::listS>, boost::edge_weight_t, void>" has no member "type"

我找不到其他人有同样的问题,我似乎无法解决问题所在。任何有关这个问题的帮助将不胜感激。

提前致谢

c++ boost graph
1个回答
0
投票

问题很可能是您无法在图表上定义边缘权重属性。例如。:

Live On Coliru

using graph_t = boost::adjacency_list</*boost::vecS, boost::vecS, boost::directedS, boost::no_property, boost::no_property*/>;

boost::property_map<graph_t, boost::edge_weight_t>::type weightmap = boost::get(boost::edge_weight, g);

不编译。你应该添加一个:

Live On Coliru

#include <boost/graph/adjacency_list.hpp>

using graph_t = boost::adjacency_list<boost::vecS, boost::vecS, boost::directedS,
      boost::no_property,
      boost::property<boost::edge_weight_t, double> >;

int main() {
    graph_t g(5);
    boost::property_map<graph_t, boost::edge_weight_t>::type weightmap = boost::get(boost::edge_weight, g);
}

你可以简化一点:

auto weightmap = get(boost::edge_weight, g);

或者考虑使用捆绑属性:

Live On Coliru

#include <boost/graph/adjacency_list.hpp>

struct EdgeProps {
    double weight = 0.0;
};

using graph_t = boost::adjacency_list<boost::vecS, boost::vecS, boost::directedS, boost::no_property, EdgeProps>;

int main() {
    graph_t g(5);
    auto weightmap = get(&EdgeProps::weight, g);
}
© www.soinside.com 2019 - 2024. All rights reserved.