2009-10-02 13 views
5

訪問者の中から頂点のバンドルプロパティを変更するにはどうすればよいですか?訪問者のバンドルプロパティの変更

グラフをサブスクリプトする単純な方法を使用したいが、訪問者に渡されるグラフパラメータはconstなので、コンパイラは変更を許可しない。

私はグラフへの参照を訪問者に保存できますが、これは奇妙なようです。

/** 

    A visitor which identifies vertices as leafs or trees 

*/ 
class bfs_vis_leaf_finder:public default_bfs_visitor { 

public: 
    /** 

    Constructor 

    @param[in] total reference to int variable to store total number of leaves 
    @param[in] g reference to graph (used to modify bundled properties) 

    */ 
    bfs_vis_leaf_finder(int& total, graph_t& g) : 
     myTotal(total), myGraph(g) 
     { 
      myTotal = 0; 
     } 

    /** 

    Called when the search finds a new vertex 

    If the vertex has no children, it is a leaf and the total leaf count is incremented 

    */ 
    template <typename Vertex, typename Graph> 
    void discover_vertex(Vertex u, Graph& g) 
    { 
     if(out_edges(u, g).first == out_edges(u, g).second) { 
      myTotal++; 
      //g[u].myLevel = s3d::cV::leaf; 
      myGraph[u].myLevel = s3d::cV::leaf; 
     } else { 
      //g[u].myLevel = s3d::cV::tree; 
      myGraph[u].myLevel = s3d::cV::tree; 
     } 
    } 

    int& myTotal; 
    graph_t& myGraph; 
}; 

答えて

4

あなたの解決策は正しいです。

グラフタイプを訪問者から切り離すには、興味深いプロパティマップのみを訪問者コンストラクタに渡し、boost::get(property, u) = s3d::cV::leaf;を使用して要素にアクセスします。このようにして、型互換性のある頂点プロパティを訪問者に渡すことができます(訪問者はより一般的で、グラフタイプの変更に名前を付けるのが賢明ではありません)。

プロパティマップのタイプはビジタークラスのテンプレートタイプ名になり、のようなものになります。

typedef property_map<graph_t, s3d_cv3_leaf_t your_vertex_info::*>::type your_property_map; 

は、同梱の特性についての完全な論文のためのhereを参照してください。

HTH

0

私はこのことを覚えていますが、訪問者のグラフへの参照を保存する必要があることは間違いありません。私はそれがこの理由であるかどうかはわかりませんが、それは、それぞれの関数の2つのバージョンを提供したくないためかもしれません。特に、グラフの回避策が利用可能な場合。

奇妙な感じがしても、グラフへの参照を渡すことが「正しい方法」かもしれないと思います。

+0

私はリファレンスが道でなければならないと考え始めています。私は何かシンプルなものを見落としていると思っていたが、誰も今まで何も示唆していないので... – ravenspoint

関連する問題