提升图表库和访问者

时间:2009-07-14 02:08:01

标签: c++ visitor boost-graph

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

到目前为止,我唯一想到的是编写一个小类来表示一个对象的类型,该对象指向我需要获取图形信息的原始顶点。然而,这看起来非常愚蠢,也很邪恶。

3 个答案:

答案 0 :(得分: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函数,它使用成员指针来使用捆绑属性。

这有帮助吗?

答案 1 :(得分: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);
    }
};

如果访问者需要修改属性,那么事情就会变得更加复杂。对于问题 - click here

答案 2 :(得分:0)

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