
On Thu, Jan 15, 2009 at 4:52 PM, James C. Sutherland < James.Sutherland@utah.edu> wrote:
Can a visitor modify properties in a graph? I would like to use the following visitor with the breadth_first_search algorithm:
struct ExecPriorityVisitor : public boost::default_dfs_visitor { ExecPriorityVisitor(); void start_vertex( Vertex v, Graph& g ){ g[v].priority = 0; } void examine_edge( Edge e, Graph& g ){ const Vertex src = boost::source(e,g); Vertex dest = boost::target(e,g); int& priority = g[dest].priority; priority = std::max( priority, g[src].priority + 1 ); } };
However, it fails to compile because apparently the graph argument must be const. That implies that I cannot modify graph properties from within the visitor? Why not?
You can, and there are two ways to go about doing it: the dirty way, and the kind of weird way. 1. You could pass the graph by const&, and then const_cast it and modify the property. That's the dirty way. 2. The weird (but right) way is to define the visitor to hold a read/write property map to the graph property in question. The visitor method still takes the graph by const&, but you have an object that has a non-const& that allows you to modify properties. Be careful that the property you're modifying isn't being used by the algorithm. You might get weird results. Andrew Sutton andrew.n.sutton@gmail.com