【问题标题】:stl remove_if with class member function result带有类成员函数结果的 stl remove_if
【发布时间】:2012-04-12 22:45:59
【问题描述】:

我有一个对象容器,列表;类 Foo 有一个成员函数 id() 返回一个整数标识符。 现在我想使用 stl 算法 remove_if 来删除一些 id 小于某个值的对象。 我不想提供id比较功能,如果我可以用STL写一行代码但boost来实现它。

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 函数来做到这一点。

【问题讨论】:

  • 如果您有足够现代的编译器,请查找lambdas
  • @Joachim Pileborg 我使用 vs2005,不支持 C++11。
  • 嗯,你在这 3 个 std 助手的帮助下走在了正确的轨道上,但不幸的是 C++ 不包括 SGI 的 compose 函数适配器。所以你不会绕过你自己的函子。这正是 C++11 的 lambda(和通用绑定器)大大提高了标准算法的可用性的原因。

标签: stl containers functor


【解决方案1】:

是的,如果您同意稍微更改Foo 的接口,则可以不使用 lambda。

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));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多