首页 文章

如何在Boost图库中继续BFS时修改属性?

提问于
浏览
1

我正在使用捆绑属性来绘制图表 . 定义如下:

class Node
{
    void AssignPlane(Plane& p)
    Plane* dp;
    double errors;
}

void Node::AssignPlane(Plane& p)
{
    dp=&p;
    errors=p.a+p.b+p.c;// simplified
}

typedef adjacency_list<vecS,vecS,bidirectionalS,Node,float> NGraph;

//...

struct NVisitor: default_bfs_visitor
{
    void discover_vertex(VertexDesc u, const NGraph& g) const
    {
        // CAN'T MODIFY G
    }
}

但我不能简单地调用g [u] .AssignPlane(p)修改顶点,也不能得到指向顶点的指针,这对我来说都是至关重要的 .
虽然这个问题可能看起来很愚蠢,作为Boost的新手,并且已经花了两周的时间来适应Boost代码的复杂风格,但我真的需要帮助 .
请不要试图回答"You need to use something other than BGL",因为除了BGL之外我什么都找不到支持我的工作 .
我还必须说,官方文件并不是要以更简单的方式解释他们的伟大工作 . 由于我已经阅读了几十次文档,所以不建议我重新阅读文档 .
我将感谢任何有用的帮助,并提前谢谢你 .

2 回答

  • 0

    你可以让这些字段变得可变

    class Node
    {
        void AssignPlane(Plane& p) const;
        Plane* mutable dp;
        double mutable errors;
    }
    
    void Node::AssignPlane(Plane& p) const
    {
        dp=&p;
        errors=p.a+p.b+p.c;// simplified
    }
    

    否则,请考虑对访问者内部的图表保持非const“引用”:

    struct NVisitor: default_bfs_visitor
    {
        NGraph* gref_;
        NVisitor(NGraph& g) : gref_(&g) {}
    
        void discover_vertex(VertexDesc u, const NGraph& g) const
        {
            Plane* p = /*get it somewhere*/;
            (*gref_)[u].AssignPlane(p);
        }
    }
    

    注意不要破坏BFS的不变量(比如,在遍历时不要编辑边) .

  • 1

    你看过活动访客了吗?

    在这个例子中,看起来图形是通过非const引用传入的:

    Depth-First Search Event Visitor

    Boost Event Visitors

相关问题