У меня есть класс 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);
}
}
Код работает хорошо и работает как задумано.
Я мог бы использовать эту версию вместо этого, но мне любопытно … Почему не работает первая версия?
Изменить код на
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
?
Других решений пока нет …