我有一个看起来如下的向量:
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_v有myInt == 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)