Изменение связанных свойств от посетителя - PullRequest
5 голосов
/ 02 октября 2009

Как мне изменить связанные свойства вершины изнутри посетителя?

Я хотел бы использовать простой метод создания сценария для графа, но переданный в посетитель параметр графика является константным, поэтому компилятор запрещает изменения.

Я могу сохранить ссылку на график в посетителе, но это кажется странным.

/**

  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;
};

Ответы [ 2 ]

4 голосов
/ 09 апреля 2010

Ваше решение правильно.

Чтобы отделить тип графика от посетителя, вы можете передать только интересующую карту свойств конструктору посетителя и получить доступ к его элементам, используя boost::get(property, u) = s3d::cV::leaf;. Таким образом, вы можете передать любое совместимое с типом свойство вершины посетителю (посетитель будет более общим и не будет восприимчив к изменениям имени в типе графика).

Тип для карты свойств будет именем типа шаблона для класса посетителя и будет выглядеть примерно так:

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

См. здесь для полной диссертации о связанных свойствах.

НТН

0 голосов
/ 14 октября 2009

Я только изучаю этот материал, но я думаю, что это правильно, что вы должны хранить ссылку на график в посетителе. Я не уверен, если это по этой причине, но это может быть потому, что они не хотели предоставлять две версии всех функций / требуют производных для предоставления двух версий каждой функции. Особенно, когда обход в графике обходной путь доступен.

Даже если это кажется странным, я думаю, что передача ссылки на график может быть «правильным путем».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...