c++boostboost-iterators

Modifying pointers in std::vector with BOOST_FOREACH


I have a class node and declared a std::vector<node*>. I would like to use BOOST_FOREACH to iterate the vector, but I'm having a little problem.

My code is like this:

data_flow_graph* dfg;
node* other_node;

[...]

BOOST_FOREACH(node* n, vector_of_nodes){
  if (n->get_id() < 100)){
    n = new node(last_id++);
    n->add_related_node(other_node);
    dfg->add_node(n);
  }
}

This is, I try to modify the address of the pointer while iterating over it. The problem is that, although the new nodes are created, the pointers in vector_of_nodes remain unchanged. I guess it is a problem of how Boost manage the access to the pointers, because if I do an equivalent processing using regular iterators:

std::vector<node*>::iterator it;
std::vector<node*>::iterator et = vector_of_nodes.end();

for (it = vector_of_nodes.begin(); it != et; ++it){
  if ((*it)->get_id() < 100)){
    (*it) = new node(last_id++);
    (*it)->add_related_node(other_node);
    dfg->add_node(*it);
  }
}

The code works well, and does as intended.

I could use that version instead, but I am curious... Why doesn't the first version work?


Solution

  • Change code to

    BOOST_FOREACH(node*& n, vector_of_nodes){
      if (n->get_id() < 100)){
        n = new node(last_id++);
        n->add_related_node(other_node);
        dfg->add_node(n);
      }
    }
    

    since in your version you change address of local pointer. And, before you use n = new node, why you don't delete old? Since you have problems with manual managing of resources, why you don't use smart pointers?