我正在使用捆绑属性作为图表。定义如下:
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代码的复杂风格,但我真的需要帮助。
请不要试图回答“你需要使用BGL之外的其他东西”,因为除了BGL之外我什么都找不到支持我的工作。
我还必须说,官方文件并不是要以更简单的方式解释他们的伟大工作。由于我已经阅读了几十次文档,所以不建议我重新阅读文档。
我将感谢任何有用的帮助,并提前谢谢你。
答案 0 :(得分:1)
你可以让字段变得可变
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
}
否则,考虑持有非const&#34;引用&#34;到访问者内部的图表:
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的不变量(比如,在遍历时不要编辑边缘)。
答案 1 :(得分:0)