2011-10-09 2 views
1
vector<unsigned int> x; 
vector<unsigned int>::iterator itr; 
unsigned int varF; 
... 
.... 

// find and delete an element from a vector. 
itr = std::find(x.begin(), x.end(), varF); // <algorithm> 
if (itr != x.end()) 
x.erase(itr); 
//or 
x.erase(std::remove(x.begin(), x.end(), varF), x.end()); 

내가 포인터포인터 벡터에서 요소 찾기 및 삭제?

내가 포인터의 벡터에 대해 위의 기능을 변환 할 수있는 방법
vector<unsigned int*> x; 

의 벡터이 벡터를 변환 할? 당신이 C++ (11), 대신 명시 적 술어의 람다를 사용할 수있는 경우

struct FindIntFromPointer 
{ 
    FindIntFromPointer(int i) : n(i) { } 
    bool operator()(int * p) const { return n == *p; } 
private: 
    int n; 
}; 

std::find_if(x.begin(), x.end(), FindIntFromPointer(varF)); 
x.erase(std::remove_if(x.begin(), x.end(), FindIntFromPointer(varF)), x.end()); 

:

+1

왜 포인터가 필요하다고 생각하십니까? –

+1

절대적으로 동일해야합니다. 정확히 뭐가 잘못 됐어? 유일한주의 사항은 벡터에서 포인터를 제거하기 전/후에 포인터를 해제해야한다는 것입니다. –

답변

8

대신 사용 findfind_if, 또는 대신 removeremove_if은 사용자 정의 술어를 사용하는

std::find_if(x.begin(), x.end(), [varF](int * p) -> bool { return varF == *p; }); 

역 참조를 비교해야하는 다른 유사한 상황에서 다시 사용하려는 경우 조건자를 템플릿으로 만들 수 있습니다. 이 경우 매번 람다를 타이핑하는 것보다 템플릿이 더 우아합니다.

+0

'operator' 다음에'()'이 누락되었습니다. –

+0

@ K-ballo : 고마워, 고쳐! –

+0

@kerrek SB : 도와 주셔서 감사합니다. – DataMiner