我正在编写一个用于操作键图的库,我正在使用Boost Graph Library为我存储数据.不幸的是,我似乎无法弄清楚如何使用它来实现正确的访问者模式,因为你不能将顶点子类化 - 你必须依赖'属性'.库中提供的访问者框架似乎非常适合使用某些算法,其中顶点都是相同的类型,但存储不同的信息.在我的问题中,顶点具有不同的类型并存储不同类型的信息 - 一些顶点是电阻器,而一些是电容器等.我如何编写基于顶点属性工作的访问者模式,而不是顶点本身?
到目前为止,我唯一想到的是编写一个小类来表示一个对象的类型,该对象指向我需要获取图形信息的原始顶点.然而,这似乎非常kludgy,邪恶的工作.
你是什么意思,你不能将顶点子类化?您可以使用自己的顶点类,只需在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;
Run Code Online (Sandbox Code Playgroud)
从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;
}
Run Code Online (Sandbox Code Playgroud)
我找不到我的访客代码使用这些属性,但我确实找到了BGL文档的相关部分:
第二个链接似乎有一个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 %f\n",
u, g[u].some_property);
}
};
Run Code Online (Sandbox Code Playgroud)
如果访问者需要修改属性,那么事情稍微复杂一些。对于问题 -单击此处
| 归档时间: |
|
| 查看次数: |
4327 次 |
| 最近记录: |