在Boost图形库中进行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代码的复杂风格,我真的需要帮助。
请不要试图回答"你需要使用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
}
否则,考虑在访问者内部保存对图的非const"引用":
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的不变量(比如,不要在遍历时编辑边缘)。
您调查过活动访客吗?
在这个例子中,看起来图是通过非const引用传入的:
深度优先搜索事件访问者
Boost Event visitor
相关文章:
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 独立读取-修改-写入顺序
- 当系统的卷被修改时,如何修改WASAPI环回捕获卷
- 修改函数中的指针(将另一个指针作为参数传递)
- 为什么我可以通过引用修改常量返回
- 对于结构,表达式必须是可修改的ivalue
- QML:修改在不同QML文件(而非main.QML)中定义的子对象的属性
- 为什么不能修改对象中的值?另外,我如何改进此链表?
- 修改创建帐户程序
- 我应该如何修改此代码以使用给定字符串中的字母打印菱形图案
- 如何从子成员函数修改父公共成员变量
- 修改 VS Code 中的默认C++代码段
- 为什么在我的函数类型后使用引用运算符 (&) 允许我修改它返回的值?
- 如何使用递归打印修改后的星号三角形图案
- 已修改的LinkedList未在文本文件本身中更新
- C++RapidXml-使用first_node()遍历以修改XML文件中节点的值
- 为什么可以修改数组 b?
- 将 C++ 类与 Rcpp 一起使用,从 C 或 R 修改它
- 修改的Fibbonaci C++得到一个大的负数
- clang 插件:在编译过程中修改 AST