Boost图库和游客(Boost Graph Library and Visitors)

2019-07-30 03:20发布

我正在写一个库,用于操纵键合图,以及我使用Boost Graph库来存储数据对我来说。 不幸的是,我似乎无法弄清楚如何使用它,因为你不能继承了顶点实现适当的访问者模式 - 你必须依靠“属性”来代替。 在库中提供的访问者框架似乎很大程度上面向朝着有一定的算法,其中顶点都是同一类型的工作,但存储不同的信息。 在我的问题,顶点是不同类型和存储不同类型的信息 - 某些顶点是电阻器,而另一些则电容器等我如何去写那个作品基于顶点的特性的访问者模式,而不是顶点本身?

我唯一的想法到目前为止已经写一个小类来表示,它指向原来的顶点,我需要得到图形信息的对象的类型。 然而,这似乎很缺憾,和邪恶的工作。

Answer 1:

你什么意思,你不能继承了顶点做? 您可以使用自己的顶点类,它只是一个图形显示的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;

从那里上克[vertex_descriptor的]应该返回顶点,例如参考:

//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) 捆绑属性

第二连杆似乎有升压功能利用使用部件指针捆绑特性。

这是否帮助?



Answer 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);
    }
};

如果访问者需要修改的属性,然后事情轻轻更加复杂。 对于问题- 请点击这里



Answer 3:

也许你可以使用boost ::变种来构建顶点类型的不相交的总和,然后在每个顶点一个boost ::变种访问者结合BGL访客?



文章来源: Boost Graph Library and Visitors