我的矢量看起来如下:
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
对象的指针。
或者还有另一种做同样事情的好方法吗?
答案 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::function
或std::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_fn
和std::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;
}