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

2 に答える 2

4

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

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

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

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

バンドルされたプロパティに関する完全な論文については、ここを参照してください。

HTH

于 2010-04-09T15:19:22.800 に答える
0

私はこのことを学んでいますが、ビジターにグラフへの参照を保存する必要があるのは正しいと思います。この理由かどうかはわかりませんが、すべての関数の 2 つのバージョンを提供したくなかったためか、各関数の 2 つのバージョンを提供するために派生物が必要だった可能性があります。特にグラフ回避策のパスが利用可能な場合。

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

于 2009-10-13T21:04:50.227 に答える