4

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

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

4

3 回答 3

6

你是什​​么意思,你不能子类化顶点?您可以使用自己的顶点类,只需在 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 函数。

这有帮助吗?

于 2009-07-14T14:24:52.780 回答
4

如果有人在乎,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);
    }
};

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

于 2009-10-02T19:30:36.390 回答
0

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

于 2009-07-14T08:08:26.440 回答