如果列表包含结构,如何将find_if与std :: list一起使用?我对此的第一次伪代码尝试如下:
typename std::list<Event>::iterator found =
find_if(cal.begin(), cal.last(), predicate);
这里的问题是谓词不是在列表中直接可见,而是在event.object.return_number()
内。我怎么想引用嵌套在struct中的int并且需要访问get方法。
答案 0 :(得分:2)
在C ++ 0x中,您的编译器可能已经部分实现了它,您可以执行以下操作:
find_if(cal.begin(), cal.last(), [&](const Event& e)
{
return e.object.return_number() == value_to_find;
});
答案 1 :(得分:2)
您可以使用仿函数类(类似函数,但允许您拥有状态,例如配置):
class Predicate
{
public:
Predicate(int x) : x(x) {}
bool operator() (const Cal &cal) const { return cal.getter() == x; }
private:
const int x;
};
std::find_if(cal.begin(), cal.end(), Predicate(x));
答案 2 :(得分:1)
您可以将谓词设置为:
struct IsEventObjectReturnNumber
{
int num;
explicit IsEventObjectReturnNumber( int n ) : num( n ) {}
bool operator()(const Event & event ) const
{
return event.object.return_number() == num;
}
};
std::list<Event>::iterator = std::find_if(cal.begin(), cal.end(), IsEventObjectReturnNumber(x));
答案 3 :(得分:0)
(不是那么简单,但是)最简单的方法(在没有C ++ 11的情况下)是一个自定义比较器:
struct CompareMyStruct {
int n_;
CompareMyStruct(int n) : n_(n) { }
bool operator()(const Event& a) const {
return a.object.return_number() == n_;
}
};
typename std::list<Event>::iterator found =
find_if(cal.begin(), cal.last(), CompareMyStruct(123));