2010-03-22 2 views
1

나는 다음 코드 (다만, 오타 또는 물건있을 수 있습니다 여기에 입력 한) 한 : 난 그냥 포인터를 내가 어떤 식 으로든 반복자를와 push_back 질수또 다른 boost :: ptr_vector에 boost :: ptr_vector <...> :: iterator를 푸시?

typedef boost::ptr_vector<SomeClass> tvec; 
tvec v; 

// ... fill v ... 

tvec vsnap; 

for(tvec::iterator it = v.begin(); it != v.end(); ++it) 
{ 
    if((*v).anyCondition) 
     vsnap.push_back(it); // (*it) or &(*it) doesn't work 
} 

내 문제는 지금 얻지 않는다 반복자에서.

내가보기 싫은 쉬운 방법이 있습니까, 아니면이 경우 ptr_vector를 잘못 선택 했나요?

미리 감사드립니다.

+0

Btw, "(* v) .anyCondition"대신 "v-> anyCondition"을 쓸 수 있습니다. –

답변

0

당신은 최초의 벡터에 의해 개최 된 객체를 clone해야합니다

for(tvec::iterator it = v.begin(); it != v.end(); ++it) 
{ 
    if((*v).anyCondition) 
     vsnap.push_back(new_clone(*it)); 
} 
2

ptr_vector를 역 참조 :: 반복자가 당신에게 참조를 제공합니다. 그런 다음 &을 사용하여 해당 참조의 주소를 가져올 수 있으므로 vsnap.push_back(&(*it))을 컴파일해야합니다. 어떤 오류가 발생하고 있습니까?

또한 사용법이 올바르지 않습니다. ptr_vector는 객체의 주소로 무엇을 하든지 관계없이 객체를 소유합니다. 따라서 코드에는 두 개의 ptr_vectors가 동일한 객체를 소유하게됩니다. 그런 다음 그들은 그것을 삭제하려고 시도 할 것이고 당신은 충돌 할 것입니다.

vsnap.push_back(v.release(it)); 

물론 이것은 이전 벡터에서 객체를 제거한 다음 새 객체에 추가합니다. 객체가 두 벡터에 머물러있게하려면 std :: vector 또는 std :: vector>를 사용할 수 있습니다. 또 다른 방법은 첫 번째 부분을 boost :: ptr_vector로 유지하는 것이지만 두 번째 것은 std :: vector로 바꾸고 아무것도 소유하지 않고 원래 벡터의 객체를 가리키는 것입니다. 그렇다면 평생 동안 조심해야합니다.

관련 문제