【问题标题】:Boost Graph Library and Visitors提升图形库和访问者
【发布时间】:2009-07-14 02:08:01
【问题描述】:

我正在编写一个用于处理债券图的库,并且我正在使用 Boost Graph Library 为我存储数据。不幸的是,我似乎无法弄清楚如何使用它来实现适当的访问者模式,因为您不能子类化顶点 - 您必须改为依赖“属性”。库中提供的访问者框架似乎非常适合使用某些顶点类型相同但存储不同信息的算法。在我的问题中,顶点具有不同类型并存储不同类型的信息 - 一些顶点是电阻器,而有些是电容器等。我该如何编写基于顶点属性而不是工作的访问者模式顶点本身?

到目前为止,我唯一的想法是编写一个小类来表示一个对象的类型,该对象指向我需要获取图形信息的原始顶点。然而,这似乎很笨拙,而且不好用。

【问题讨论】:

    标签: c++ visitor-pattern boost-graph


    【解决方案1】:

    你的意思是,你不能子类化顶点?您可以使用自己的顶点类,只需在 Graph typedef 中指定它即可。在使用 BGL 算法时,您甚至可以将成员用作属性。

    至于其他方式(IMO 更难),您需要创建一个顶点属性列表并使用顶点描述符访问它...我认为。

    编辑:您在定义图形类型时指定顶点/边类:

    struct Vertex {
        double some_property;
    };
    
    struct Edge {
        double weight;
    };
    
    typedef boost::adjacency_list<
        boost::listS, boost::vecS, boost::undirectedS, Vertex, Edge
    > Graph; //sorry about the formatting
    
    Graph g;
    

    g[vertex_descriptor] 应该从哪里返回对 Vertex 的引用,例如:

    //add 100 vertices
    for (int i=0; i<100; ++i) {
        Graph::vertex_descriptor v = add_vertex(g);
        g[v].some_property = -1.0;
    }
    
    //zero some_property for all vertices
    for (Graph::vertex_iterator i = vertices(g).first;
                                i != vertices(g).second;
                                ++i)
    {
        g[*i].some_property = 0.0;
    }
    

    我找不到使用这些属性的访问者代码,但我确实找到了 BGL 文档的相关部分:

    1) 关于Internal Properties的部分,建议您改用:
    2)Bundled Properties

    第二个链接似乎有一个 Boost 函数,它使用成员指针使用捆绑属性。

    这有帮助吗?

    【讨论】:

    • 真的吗?我正在寻找这方面的文档,但找不到太多 - 您能否举一个简短的示例,在其中提供自定义顶点类,而不是将属性附加到顶点上?
    • 我的文档也有问题。回家后我会发布代码示例。
    • 确实如此 - 我最终在一次尝试解决该问题时采用了类似的方法。这里唯一的问题是我还需要从元素的属性中访问顶点信息,这涉及跟踪元素自己的 vertex_descriptor 并通过描述符路由所有连接信息请求。它最终变得相当复杂,我现在相当确定我最好自己编写一个小图实现。不过谢谢,当我将来将这个库用于其他事情时,捆绑属性绝对是要走的路!
    【解决方案2】:

    如果有人关心,2 个月后,这里有一位访客正在查看该物业。

    class demo_visitor : public default_bfs_visitor {
    public:
        template <typename Vertex, typename Graph>
        void discover_vertex( Vertex u, Graph& g)
        {
            printf("Visited vertex %d with property %f\n",
                u, g[u].some_property);
        }
    };
    

    如果访问者需要修改属性,那么事情会稍微复杂一些。对于问题 - click here

    【讨论】:

    • 你如何使用它? 'breadth_first_search(G, vertex(0, G), demo_visitor())' 给出错误。
    • @user1344784 您遇到什么错误?也许您可以使用您的代码和收到的错误发布一个新问题。如果您这样做,请在此处发布您的问题的链接,以便我找到它。
    【解决方案3】:

    也许您可以使用 boost::variant 构造顶点类型的不相交总和,然后将 BGL 访问者与每个顶点的 boost::variant 访问者结合起来?

    【讨论】:

      猜你喜欢
      • 2012-10-05
      • 2021-09-07
      • 1970-01-01
      • 1970-01-01
      • 2018-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多