在对象向量上使用find_if

时间:2011-07-13 12:44:16

标签: vector c++

我的矢量看起来如下:

class Foo
{
    //whatever
};

class MyClass
{
    int myInt;
    vector<Foo> foo_v;
};

让我们说,在main

int main (void)
{
    vector<MyClass> myClass_v;
}

我想找到myClass_v中有myInt == bar的对象。我不关心foo_v。我想过使用std::find_if函数:

std::find_if(myClass_v.begin(),myClass_v.end(),condition);

bool MyClass::condition(MyClass mc)
{
    if(mc.myInt==5)
        return true;
    else
        return false;
}

然而,编译器说condition()缺少参数。你能告诉我我做错了什么吗?我认为std::find_if会调用condition(*First)First是指向myClass对象的指针。

或者还有另一种做同样事情的好方法吗?

4 个答案:

答案 0 :(得分:51)

这不是谓词如何运作的。您必须提供免费功能 bool Comparator(const MyClass & m) { ... },或构建功能对象,这是一个重载operator()的类:

struct MyClassComp
{
  explicit MyClassComp(int i) n(i) { }
  inline bool operator()(const MyClass & m) const { return m.myInt == n; }
private:
  int n;
};

std::find_if(v.begin(), v.end(), MyClassComp(5));

在C ++ 0x中:

std::find_if(v.begin(), v.end(),
             [](const MyClass & m) -> bool { return m.myInt == 5; });

这种无捕捉的lambda实际上相当于一个自由函数。这是一个模仿谓词对象的捕获版本:

const int n = find_me();
std::find_if(v.begin(), v.end(),
             [n](const MyClass & m) -> bool { return m.myInt == n; });

答案 1 :(得分:3)

struct condition {
  bool operator()(const MyClass& mc) {
    return mc.myInt == 5;
  }
}

答案 2 :(得分:2)

你可以使用仿函数或不属于MyClass的常规函数​​,或者使用MyClass中的静态函数来做 - 这是一个非成员函数的例子(基本上只是删除条件定义的MyClass ::部分) ):

#include <algorithm>
#include <vector>

using namespace std;

class Foo
{
  //whatever
};

class MyClass
{
  public:
  int myInt;
  vector<Foo> foo_v;
};

bool condition(MyClass mc)
{
  if(mc.myInt==5)
    return true;
  else
    return false;
}


int main (void)
{
  vector<MyClass> myClass_v;
  std::find_if(myClass_v.begin(),myClass_v.end(),condition);
}

答案 3 :(得分:1)

除了 Kerrek SB 写的内容之外,您还可以使用成员函数作为谓词。

将其定义为bool MyClass::condition() { return mc.myInt==5; } - 参数是不必要的,因为它已将对象作为隐式参数。

使用它时,从功能标题中&MyClass::condition包裹std::mem_fcn(指向成员函数的指针)。

std::find_if(myClass_v.begin(), myClass_v.end(), std::mem_fcn(&MyClass::condition));


更简洁的方法是使用std::functionstd::bind。替换:

    std::mem_fcn(&MyClass::condition)

    std::function<bool (MyClass &)>(&MyClass::condition)    , or
    std::bind(&MyClass::condition, std::placeholders::_1).



如果MyClass_v已声明为std::vector<MyClass *> myClass_v;

std::function<bool (MyClass &)>(&MyClass::condition)应更改为:std::function<bool (MyClass *)>(&MyClass::condition)。 对于std::mem_fnstd::bind - 无需进行任何更改。


代码:

#include <vector>
#include <functional>
#include <algorithm>
#include <iostream>

class Foo{};

struct MyClass
{
    int myInt;
    std::vector<Foo> foo_v;
    bool condition(){ return myInt==5; }
};

int main (void)
{
    std::vector<MyClass> myClass_v{ {1,{}}, {3,{}}, {5,{}}, {6,{}} };
    std::cout << std::find_if(myClass_v.begin(), myClass_v.end(), std::mem_fn(&MyClass::condition))->myInt << std::endl;
    return 0;
}