2013-04-11 2 views
3

오브젝트의 벡터가 있습니다. 내 데이터 구조는 다음과 같은 : 내가 마지막 요소보다 작거나 같은 요소를 삭제하려는 벡터 VEC에서 지금std :: remove_if에서 술어 함수 사용

vec 
((10.0,2),(100,3),(19.0,3)...) 

:

class my_class{ 
     float a; int b; 
}; 
my_class obj; 
vector<my_class> vec; 

벡터 VEC는 형태의 데이터를 포함 VEC의 ...이를 위해 전 기능을 지우고 remove_if 사용하고 있습니다 :

vec.erase(std::remove_if(vec.begin(), vec.end(), predicate_function(vec, (vec.end()-1).a, (vec.end()-1).b)), vec.end()); 

나는 "VEC"의 반복을 수행 가지고있는 predicate_function을. 그러나 이것은 std :: remove_if를 사용하는 목적을 무효화합니다. 누군가가 remove_if를 작동시키기 위해 predicate_function이 어떻게 보이는지에 관해서 도움을받을 수 있습니까? lambda_function을 사용하고 싶지 않습니다. 또한 제 컴파일러는 GCC입니다

답변

3

술어 기능은 각 반복자의 매개 변수를 자동으로 전달합니다.

vec.erase(std::remove_if(vec.begin(), vec.end(), predicate_function), vec.end()); 

C++ 측면에서, std::remove_if 어느 함수 나 펑터 인, 3 차 매개 변수로 UnaryPredicate을 기대 :로 단순히 호출 할 것이다

bool predicate_function(const my_class& m) 
{ 
    //Some logic here 
} 

: 그래서 같이 보일 것 인수 1 개를 받고 bool을 반환합니다.

편집 : 당신은 코멘트에서하고 싶은 일을하려면, 당신은 functor 사용해야 할 것 (또는 std::bind, 그러나 우리는 여기서 펑터의 길을 갈 것이다) 다음 predicate_function 내부 지금

struct compare_last 
{ 
    const my_class last_; 

    compare_last(const my_class& last) 
     : last_(last) 
    { } 

    bool operator()(const my_class& m) const 
    { 
     return m == last_; //Or however you do your comparisons 
    } 
}; 

my_class& last = *(--vec.end()); 
vec.erase(std::remove_if(vec.begin(), vec.end(), compare_last(last)), vec.end()); 
+1

방법 것 술어 객체가 단지 하나의 반복자의 매개 변수를 전달되기 때문에 나는 벡터의 마지막 객체와 비교를 수행한다. 추신 : 회신 해 주셔서 감사합니다 –

+0

@ JannatArora functor로이를 수행하는 방법은 제 편집을 참조하십시오. – Yuushi

+0

'remove_if()'가 제거해야 할 것을 제거한다고 생각하지 않습니까? 왜 당신은'vec.erase()'를 유지 했습니까? 뿐만 아니라 vecend()는'erase()'의 마지막 매개 변수로 호출 할 때부터'remove_if()'가 반환 할 때까지 변경 될 수 있습니다. –