提升图形库和访问者

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

到目前为止,我唯一的想法是编写一个小类来表示一个对象的类型,它指向我需要获取图形信息的原始顶点。 但是,这看起来非常糟糕,并且与之合作。


你是什​​么意思,你不能划分出顶点? 你可以使用你自己的顶点类,它只是在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)关于内部属性的部分,建议您使用:
2)捆绑属性

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

这有帮助吗?


如果有人在乎,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 %fn",
            u, g[u].some_property);
    }
};

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


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

链接地址: http://www.djcxy.com/p/51049.html

上一篇: Boost Graph Library and Visitors

下一篇: Good Java graph algorithm library?