2013-11-26 3 views
0

에서 제거 :저장 반복자는 내가 좋아하는 뭔가를하고 싶지는 다른 컨테이너

std::vector<Class*> myVector; 
std::vector<Class*> tempvector; 
// Fill myVector 

for (std::vector<Class*>::iterator it = myVector.begin(); it != myVector.end(); ++it) 
    if (some condition) 
     tempvector.push_back(it*); 

for (std::vector<Class*>::iterator it = tmpvector.begin(); it != tmpvector.end(); ++it) 
    myVector.erase(it); 

즉, 내가 myVector를 채우기, 그것은 반복과에 저장되어 제거를위한 몇 가지 요소를 표시한다 시간 벡터이면 시간 벡터가 반복되고 myVector에서 표시된 요소가 삭제됩니다.

어떻게하면됩니까? 나중에 제거 할 수 있도록 요소를 표시해야합니다.

답변

0

벡터에서 요소를 지울 때 삭제 된 요소보다 더 오래된 모든 반복자가 무효화되므로 마지막 반복기에서 첫 번째 반복기로 반복해야합니다.

std::vector<Class*> myVector; 
std::vector<std::vector<Class*>::iterator> tempvector; 
// Fill myVector 

for (std::vector<Class*>::iterator it = myVector.begin(); it != myVector.end(); ++it) 
    if (some condition) 
     tempvector.push_back(it); 

for (std::vector<std::vector<Class*>::iterator>::iterator it = tmpvector.end(); it != tmpvector.begin(); --it) 
    myVector.erase(*it); 
+0

삭제이 댓글이 – smc

+0

귀하의 질문에 답변을했을 때 대답을 확인하려면 – Drax

+0

미안 내 나쁜 – smc

0

내가 간단 아이디어를 소개 할 수 있도록 intClass* 변경이보십시오. 나는 함께 .erase, std::remove_ifstd::find을 혼합했습니다

std::vector<int> myVector; 
std::vector<int> toRemove; 

for (std::vector<int>::iterator it=myVector.begin(); it != myVector.end(); ++it) 
    if (...condition...) 
     toRemove.push_back(*it); 

myVector.erase(std::remove_if(myVector.begin(), myVector.end(), 
    [&toRemove](int x) 
    { 
     return std::find(toRemove.begin(), toRemove.end(), x) != toRemove.end(); 
    }), myVector.end()); 

또는

for (std::vector<int>::iterator it=myVector.begin(); it!=myVector.end();) 
{ 
    if(std::find(toRemove.begin(), toRemove.end(), x) != toRemove.end()) 
     it = myVector.erase(it); 
    else 
     ++it; 
} 
+0

첫 번째 솔루션은 잘 작동하지만 많은 시간을해야 할 때 매우 효율적이지는 않습니다 :/두 번째 것은 저에게 효과적이지 않습니다. 아마 'x '잘못했다. – smc