【问题标题】:custom properties for edges in the BGLBGL 中边缘的自定义属性
【发布时间】:2011-12-18 15:42:33
【问题描述】:

我开始将 BGL 用于一些与图形相关的任务。我有大量的边,每条边都有几个属性,其中之一是它的权重。 (所有属性都是浮点数和整数)。由于我以前从未使用过 BGL(和/或类似的 CPP 库),所以我对所有这些类型、类以及如何正确使用它有点迷茫。

我像这样添加我的边缘:

struct EdgeProperty
{
    int weight;
    float e1;
    float e2;
};

typedef adjacency_list<vecS, vecS, bidirectionalS, no_property, EdgeProperty> Graph;
...
EdgeProperty prop;
node1 = ...;
node2 = ...;
prop.e1 = ...;
prop.e2 = ...;
prop.weight = ...;

add_edge(node1, node2, prop, g);

然后,我需要稍后访问我的财产,我正在尝试这样做:

property_map<Graph, EdgeProperty>::type EdgeWeightMap = get(EdgeProperty, g);
w = get(EdgeWeightMap,some_edge);

但是,这甚至无法编译。它在错误消息中说:

error: no type named ‘kind’ in ‘struct EdgeProperty’

在其他错误中,我认为现在不太重要。我不知道这是否是您使用自定义属性的方式。您能否向我解释一下kind 错误消息以及如何使用自定义属性?我找不到有关此主题的任何文档(我理解)。

【问题讨论】:

    标签: c++ boost boost-graph


    【解决方案1】:

    看看这段代码,我相信它自己解释了一些事情:

    #include <boost/graph/adjacency_list.hpp>
    #include <boost/graph/properties.hpp>
    #include <iostream>
    
    namespace bgl = boost;
    
    struct EdgeInfo
    {
        int weight;
        float e1;
        float e2;
    };
    
    struct EdgeInfoPropertyTag
    {
        typedef bgl::edge_property_tag kind;
        static std::size_t const num; // ???
    };
    
    std::size_t const EdgeInfoPropertyTag::num = (std::size_t)&EdgeInfoPropertyTag::num;
    
    typedef bgl::property<EdgeInfoPropertyTag, EdgeInfo> edge_info_prop_type;
    typedef bgl::adjacency_list<bgl::vecS, bgl::vecS, bgl::bidirectionalS,
        bgl::no_property, edge_info_prop_type> Graph;
    typedef bgl::graph_traits<Graph>::vertex_descriptor vertex_descr_type;
    typedef bgl::graph_traits<Graph>::edge_descriptor edge_descr_type;
    
    int
    main ()
    {
        Graph g;
        vertex_descr_type u, v;
        u = add_vertex (g);
        v = add_vertex (g);
        EdgeInfo props;
        props.weight = 3;
        std::pair<edge_descr_type, bool> result = add_edge (u, v, props, g);
    
        EdgeInfo p = get (EdgeInfoPropertyTag (), g, result.first);
        std::cout << "weight: " << p.weight << std::endl;
    }
    

    您需要了解 BGL 所基于的概念。

    通过这种方式,您可以将任何类型的值挂在边上(对于顶点也是如此)。您还可以使用预定义类型的属性,例如 edge_weight_tedge_name_t 我相信。

    另请参阅有关 custom edge properties 的 BGL 文档。

    【讨论】:

    • 那个链接对我帮助很大。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-29
    • 1970-01-01
    • 2011-11-21
    • 1970-01-01
    • 2012-07-01
    • 1970-01-01
    相关资源
    最近更新 更多