stl remove_if с результатом функции-члена класса - PullRequest
1 голос
/ 29 марта 2012

У меня есть контейнер объектов, список;и класс Foo имеет функцию-член id (), возвращающую целочисленный идентификатор.Теперь я хочу использовать алгоритм stl remove_if для удаления некоторых объектов, чей идентификатор меньше значения. Я не хочу предоставлять функцию для сравнения идентификаторов , если я могу написать однострочный код с STL, но повысить его для реализации.

class Foo{
public:
  unsigned id() const {return id_;}
  ...
private:
  unsigned id_
  ...
};
list<Foo> foo_list;
std::remove_if(foo_list.begin(), foo_list.end(), ???);

Если STL можетделать это только с функциями std :: bind2nd, stl :: less (), std :: mem_fun_ref () или другими функциями stl.

1 Ответ

2 голосов
/ 20 апреля 2012

Да, этого можно добиться без лямбд, если вы согласитесь немного изменить интерфейс Foo.

class Foo
  {
public:
  Foo(unsigned id)
    : id_(id) {}
  bool is_equal(unsigned id) const
    { return id_ == id; }
private:
  unsigned id_;
  };

typedef list<Foo> FooList;

FooList foo_list;
foo_list.push_back(Foo(1));
foo_list.push_back(Foo(2));

unsigned to_remove = 1;
foo_list.remove_if(std::bind2nd(std::mem_fun_ref(&Foo::is_equal), to_remove));
...