为何BGL访问器内无法修改边属性?如何在自定义访问器中修改边权重?
解决Dijkstra访问器中修改边属性的只读对象错误
嘿,这个问题我之前也碰到过!你收到的assignment of member ‘EdgeProperty::weight’ in read-only object错误,根源在于examine_edge函数里的Graph参数是const &类型——Boost的默认Dijkstra访问器会把图作为只读引用传递,防止算法执行过程中意外修改图的核心结构,但这也挡住了你修改边属性的操作。
下面给你两个可行的解决办法,你可以根据自己的场景选择:
方法1:去掉Graph参数的const限定
直接把examine_edge里的Graph const & g改成Graph & g,这样就能正常修改边属性了:
class custom_dijkstra_visitor : public boost::default_dijkstra_visitor { public: template < typename Edge, typename Graph > void examine_edge(Edge e, Graph & g) { // 移除const修饰符 g[e].weight = 1/g[e].residual_capacity; } };
⚠️ 注意:这么做的时候,要确保你只是修改边的属性(比如weight),而不是修改图的结构(比如添加/删除边、改变顶点连接关系)——Dijkstra算法本身不依赖边属性的动态修改,只要你不破坏算法的核心逻辑,这么用是没问题的。
方法2:将weight声明为mutable属性
如果你不想改动访问器函数的参数类型,可以把EdgeProperty里的weight成员标记为mutable,这样即使在const对象上也能修改这个属性:
struct EdgeProperty{ mutable float weight; // 添加mutable关键字 float capacity; float residual_capacity; };
这种方式适合那些逻辑上属于“可动态调整的附属属性”的场景,但要谨慎使用mutable——它会打破const对象的只读语义,别用它修改那些逻辑上应该是只读的成员。
最后再提个小提醒:你要确认在examine_edge阶段修改weight是符合你的业务逻辑的——Dijkstra算法在遍历过程中,这个时机修改的权重会不会被算法正确使用,提前理清楚时序哦。
内容的提问来源于stack exchange,提问作者井上由一
相关产品推荐
相关产品推荐

