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;

有关捆绑属性的完整论文,请参见此处

高温高压

于 2010-04-09T15:19:22.800 回答
0

我只是在学习这些东西,但我认为您必须在访问者中存储对图形的引用是正确的。我不确定是否是因为这个原因,但可能是因为他们不想提供所有函数的两个版本/需要派生类来提供每个函数的两个版本。特别是当图形变通方法可用时。

即使感觉很奇怪,我认为传递对图表的引用可能是“正确的方式”。

于 2009-10-13T21:04:50.227 回答