在对象向量上使用find_if

gra*_*amm 32 c++ vector

我有一个看起来如下的向量:

class Foo
{
    //whatever
};

class MyClass
{
    int myInt;
    vector<Foo> foo_v;
};
Run Code Online (Sandbox Code Playgroud)

让我们说,在main:

int main (void)
{
    vector<MyClass> myClass_v;
}
Run Code Online (Sandbox Code Playgroud)

我想找到一个对象myClass_vmyInt == bar.我不在乎foo_v.我想过使用这个std::find_if功能:

std::find_if(myClass_v.begin(),myClass_v.end(),condition);
Run Code Online (Sandbox Code Playgroud)

bool MyClass::condition(MyClass mc)
{
    if(mc.myInt==5)
        return true;
    else
        return false;
}
Run Code Online (Sandbox Code Playgroud)

然而,编译器说这condition()是缺少参数.你能告诉我我做错了什么吗?我认为这std::find_if会叫condition(*First),有First是一个指向myClass对象.

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

Ker*_* SB 54

这不是谓词的工作方式.你必须提供一个自由函数 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));
Run Code Online (Sandbox Code Playgroud)

在C++ 0x中:

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

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

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

  • 没什么,但是如果你想让比较值可以修改(我的`n`),你需要将它存储在某个地方,所以谓词对象是保存这些额外信息的自然方式.如果你只有一个全局固定的选择规则,那么一定要使用一个自由函数`bool(const MyClass&m){...}`. (3认同)
  • 哦,好吧,我刚刚发现`谓词不是这样工作的。你必须建立一个函数对象。`误导。 (2认同)