Изменение указателей в std :: vector с помощью BOOST_FOREACH

У меня есть класс node и объявил std::vector<node*>, Я хотел бы использовать BOOST_FOREACH для итерации вектора, но у меня небольшая проблема.

Мой код такой:

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);
}
}

Это я пытаюсь изменить адрес указателя во время итерации по нему. Проблема в том, что, хотя новые узлы созданы, указатели в vector_of_nodes остается неизменным. Я думаю, это проблема того, как Boost управляет доступом к указателям, потому что, если я делаю эквивалентную обработку с использованием обычных итераторов:

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);
}
}

Код работает хорошо и работает как задумано.

Я мог бы использовать эту версию вместо этого, но мне любопытно … Почему не работает первая версия?

0

Решение

Изменить код на

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);
}
}

в вашей версии вы меняете адрес локального указателя. И, прежде чем использовать n = new nodeпочему вы не удаляете старое? Поскольку у вас есть проблемы с ручным управлением ресурсами, почему вы не используете smart pointers?

2

Другие решения

Других решений пока нет …