2013-04-12 4 views
0

클래스가 node이고 std::vector<node*>으로 선언되었습니다. 벡터를 반복하는 데 BOOST_FOREACH를 사용하고 싶지만 조금 문제가 있습니다.BOOST_FOREACH를 사용하여 std :: vector에서 포인터 수정

내 코드는 다음과 같다 :

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의 포인터가 변경되지 않는다는 것입니다.

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

+0

[placement'new'] (http://en.wikipedia.org/wiki/Placement_syntax)를 사용할 수 있습니까? –

답변

2

변경 코드. 그리고 n = new node을 사용하기 전에 왜 이전을 삭제하지 않습니까? 리소스 수동 관리에 문제가있어 smart pointers을 사용하지 않는 이유는 무엇입니까?

+0

감사합니다. 완벽하게 작동했습니다. 나중에 사용하기 위해 내 dfg에 보관해야하므로 이전 노드를 삭제하지 않습니다. 따라서 이전 노드가 아직 다른 곳에서도 볼 수 있습니다. :) – eSedano

관련 문제