如何在 Boost Graph Library 中进行 BFS 时修改属性?
How to modify properties while proceeding BFS in Boost Graph Library?
我正在使用捆绑的 属性 作为图表。定义如下:
class Node
{
void AssignPlane(Plane& p)
Plane* dp;
double errors;
}
void Node::AssignPlane(Plane& p)
{
dp=&p;
errors=p.a+p.b+p.c;// simplified
}
typedef adjacency_list<vecS,vecS,bidirectionalS,Node,float> NGraph;
//...
struct NVisitor: default_bfs_visitor
{
void discover_vertex(VertexDesc u, const NGraph& g) const
{
// CAN'T MODIFY G
}
}
但我不能简单地调用 g[u].AssignPlane(p) 来修改顶点,也不能获取指向顶点的指针,这对我来说都很重要。
虽然这个问题看起来很傻,但作为一个Boost新手,为了适应Boost代码的曲折风格折腾了两周,我真的很需要帮助。
请不要尝试回答 "You need to use something other than BGL",因为除了 BGL,我找不到任何支持我工作的东西。
而且我还必须说,官方文档并不是为了以更简单的方式解释他们的伟大工作。由于我已经阅读了数十次文档,所以不建议我重新阅读文档。
我将不胜感激任何有用的帮助,并提前说声谢谢。
您可以使字段可变
class Node
{
void AssignPlane(Plane& p) const;
Plane* mutable dp;
double mutable errors;
}
void Node::AssignPlane(Plane& p) const
{
dp=&p;
errors=p.a+p.b+p.c;// simplified
}
否则,请考虑对访问者内部的图形持有非常量 "reference":
struct NVisitor: default_bfs_visitor
{
NGraph* gref_;
NVisitor(NGraph& g) : gref_(&g) {}
void discover_vertex(VertexDesc u, const NGraph& g) const
{
Plane* p = /*get it somewhere*/;
(*gref_)[u].AssignPlane(p);
}
}
注意不要破坏 BFS 的不变量(例如,不要在遍历时编辑边)。
您调查过活动访客吗?
在这个例子中,图形似乎是通过非常量引用传入的:
我正在使用捆绑的 属性 作为图表。定义如下:
class Node
{
void AssignPlane(Plane& p)
Plane* dp;
double errors;
}
void Node::AssignPlane(Plane& p)
{
dp=&p;
errors=p.a+p.b+p.c;// simplified
}
typedef adjacency_list<vecS,vecS,bidirectionalS,Node,float> NGraph;
//...
struct NVisitor: default_bfs_visitor
{
void discover_vertex(VertexDesc u, const NGraph& g) const
{
// CAN'T MODIFY G
}
}
但我不能简单地调用 g[u].AssignPlane(p) 来修改顶点,也不能获取指向顶点的指针,这对我来说都很重要。
虽然这个问题看起来很傻,但作为一个Boost新手,为了适应Boost代码的曲折风格折腾了两周,我真的很需要帮助。
请不要尝试回答 "You need to use something other than BGL",因为除了 BGL,我找不到任何支持我工作的东西。
而且我还必须说,官方文档并不是为了以更简单的方式解释他们的伟大工作。由于我已经阅读了数十次文档,所以不建议我重新阅读文档。
我将不胜感激任何有用的帮助,并提前说声谢谢。
您可以使字段可变
class Node
{
void AssignPlane(Plane& p) const;
Plane* mutable dp;
double mutable errors;
}
void Node::AssignPlane(Plane& p) const
{
dp=&p;
errors=p.a+p.b+p.c;// simplified
}
否则,请考虑对访问者内部的图形持有非常量 "reference":
struct NVisitor: default_bfs_visitor
{
NGraph* gref_;
NVisitor(NGraph& g) : gref_(&g) {}
void discover_vertex(VertexDesc u, const NGraph& g) const
{
Plane* p = /*get it somewhere*/;
(*gref_)[u].AssignPlane(p);
}
}
注意不要破坏 BFS 的不变量(例如,不要在遍历时编辑边)。
您调查过活动访客吗?
在这个例子中,图形似乎是通过非常量引用传入的: