2011-10-31 6 views
5

グラフ関連のタスクでBGLを使い始めました。私は多数の辺を持ち、各辺にはいくつかの性質があり、そのうちの1つはその重みです。 (すべてのプロパティはfloatとintです)。これまで私はBGL(および/または同様のCPPライブラリ)で作業していなかったので、これらのすべてのタイプ、クラス、および使い方を少し失ってしまいました。BGLのエッジのカスタムプロパティ

私はこのような私のエッジを追加します。次に

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エラーメッセージとカスタムプロパティの使い方を教えてください。私はこのトピックについて何らかのドキュメンテーション(私が理解している)を見つけることができませんでした。

答えて

4

このコードを見てみましょう、私はそれは、独自のいくつかのことを説明すると信じて:

#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のような定義済みのタイプのプロパティを使用することもできます。

また、BGLドキュメントabout custom edge propertiesも参照してください。

+0

そのリンクは私を助けました。ありがとう! – janoliver

関連する問題