2013-04-11 3 views
3

У меня есть вектор объектов. Моя структура данных является следующее:Использование функции предиката в std :: remove_if

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

Вектор VEC содержит данные формы:

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

Теперь из вектора 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()); 

predicate_function, который у меня есть делает итерации по «VEC». Однако это побеждает цель использования std :: remove_if. Может кто-то, пожалуйста, помогите, как должна выглядеть функция predicate_function для того, чтобы remove_if работал. Я не хочу использовать lambda_function. Также моим компилятором является GCC

ответ

3

Функция предиката автоматически передаст параметры из каждого итератора. Так что бы выглядеть примерно так:

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

Что бы тогда просто называться как:

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

В терминах C++, std::remove_if ожидает UnaryPredicate как 3-м параметром, который является либо функция или функтор принимает 1 аргумент и возвращает bool.

Edit: Для того, чтобы сделать то, что вы хотите в комментарии, вы должны были бы использовать functor (или std::bind, но мы будем идти по пути функтор здесь):

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

Теперь внутри predicate_function как бы Я выполняю сравнение с последним объектом вектора ... поскольку предикатный объект передается параметрами только одного итератора. PS: Спасибо, что ответили –

+0

@JannatArora Посмотрите мое редактирование, как это сделать с помощью функтора. – Yuushi

+0

Не кажется ли вам, что 'remove_if()' удаляет то, что нужно удалить? Почему вы сохранили 'vec.erase()'? Не только это, но vec.end() может измениться между тем, как вы его называете последним параметром 'erase()', и возвращает time_ remove_if() '. –

Смежные вопросы