使用带有结构的std :: list的find_if查找int里面的int

时间:2010-10-22 11:48:23

标签: c++ list stl

如果列表包含结构,如何将find_if与std :: list一起使用?我对此的第一次伪代码尝试如下:

typename std::list<Event>::iterator found = 
    find_if(cal.begin(), cal.last(), predicate); 

这里的问题是谓词不是在列表中直接可见,而是在event.object.return_number()内。我怎么想引用嵌套在struct中的int并且需要访问get方法。

4 个答案:

答案 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));