我正在编写一个用于操作键图的库,我正在使用Boost Graph Library为我存储数据。不幸的是,我似乎无法弄清楚如何使用它来实现正确的访问者模式,因为你不能将顶点子类化 - 你必须依赖'属性'。库中提供的访问者框架似乎非常适合使用某些算法,其中顶点都是相同的类型,但存储不同的信息。在我的问题中,顶点具有不同的类型并存储不同类型的信息 - 一些顶点是电阻器,而一些是电容器等。我如何编写基于顶点属性工作的访问者模式,而不是顶点本身?
到目前为止,我唯一想到的是编写一个小类来表示一个对象的类型,该对象指向我需要获取图形信息的原始顶点。然而,这看起来非常愚蠢,也很邪恶。
答案 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访问者结合起来?