2017-12-20 17 views
2

私は次のようにインスタンス化グラフを持っている:ブーストグラフライブラリで頂点記述子を追跡する必要がありますか?

typedef boost::property<boost::edge_weight_t, uint32_t> EdgeWeightProperty; 
typedef boost::property<boost::vertex_index_t, uint32_t> VertexProperty; 
typedef boost::adjacency_list<boost::vecS, boost::setS, 
           boost::undirectedS, VertexProperty, 
           EdgeWeightProperty, boost::setS> Graph; 

私はこのグラフを更新する必要があり、例えばエッジを追加または削除します。私は頂点を保存するためのセットを使用していますので、私は彼らのインデックスを使用することはできませんが、私はマップを保つことができます。

unordered_map<uint32_t, Vertex_Descriptor> 

頂点記述子に私のインデックスをマップするので、私は中に直接、後でアクセスすることができますBGLでは、このアプローチが有効ですが、このマップオーバーヘッドが追加されます。

私は何とかカスタムインデックスを指定することができますか、BGLに頂点を置く/置くときに比較するものはありますか?または、頂点記述子をマップに保持することが最善の方法ですか? coliru

答えて

1

短い答えで

全例:はい。

注:

  1. ではなくlabeled_graph<>アダプタをunderdocumented考えてみましょう。あなた自身のグローバルadd_vertexヘルパーが使用されていない

  2. あなたが書き込みをした場合でも、(YMMVので、私もその中のバグの数を発見した免責事項が)私はそれは、ライブラリのサンプルで使用していますし、また、I have a number of answers using it on this site信じています:

    const auto vd = add_vertex(i, g); 
    

    ADLにご注意ください! add_vertexという名前を付けて、(add_vertex)(i, g)を書かない限り、ADLはboostに過負荷を見つけるでしょう。これはadjacency_list<>が(他の関連するタイプの中でも)その名前空間に由来しているからです。

    だから、あなたはあなたのヘルパー関数をドロップすると、まだ財産取っブーストadd_vertexオーバーロードを使用してそのようにそれを書くことができます:MutablePropertyGraph concept, under "Valid Expressions"

  3. for (int i = 0; i < 10; ++i) 
        id_vertex[i] = add_vertex(i, g); 
    
    はまた、あなたがprint_graph

    を使用することができ、グラフを印刷するループの交換を

Live On Coliru

枚の
#include <boost/graph/adjacency_list.hpp> 
#include <boost/graph/graph_utility.hpp> 
#include <iostream> 

typedef boost::property<boost::vertex_index_t, uint32_t> VertexProperty; 
typedef boost::property<boost::edge_weight_t, uint32_t> EdgeWeightProperty; 
typedef boost::adjacency_list<boost::vecS, boost::setS, boost::undirectedS, VertexProperty, EdgeWeightProperty, 
           boost::setS> Graph; 
typedef boost::graph_traits<Graph>::vertex_descriptor Vertex; 
typedef boost::graph_traits<Graph>::vertex_iterator vertex_it; 

int main() { 
    Graph g; 
    std::unordered_map<uint32_t, Vertex> id_vertex; 

    for (int i = 0; i < 10; ++i) 
     id_vertex[i] = add_vertex(i, g); 

    std::pair<vertex_it, vertex_it> vp; 
    for (int i = 0; i < 9; ++i) 
     add_edge(id_vertex[i], id_vertex[i + 1], g); 

    clear_vertex(id_vertex[2], g); 
    remove_vertex(id_vertex[2], g); 

    print_graph(g); 
} 

プリント

0 <--> 1 
1 <--> 0 
3 <--> 4 
4 <--> 3 5 
5 <--> 4 6 
6 <--> 5 7 
7 <--> 6 8 
8 <--> 7 9 
9 <--> 8 
+0

素早く答えてくれてありがとう!ヘルパー関数は他のコードからの残差でした。悲しいことに、プログラムが正しく機能するには、プログラムのスペースを倍にする必要があります。 ( – Fynn

+0

アイデア:いつでも外部インデックスを保持する必要はありません。また、ベクトルを使用してより効果的な割り当てを行うこともできます。これらの回答もまた、侵入型コンテナの使用方法を参照してください。 :https://stackoverflow.com/questions/32296206/bgl-indexing-a-vertex-by-keysおよびhttps://stackoverflow.com/questions/45845469/make-a-boost-filtered-graph-by-vertex -label-property/45850742#45850742 – sehe

関連する問題