найти int внутри структуры с помощью find_if для std :: list со структурами - PullRequest
1 голос
/ 22 октября 2010

Как я могу использовать find_if с std :: list, если список содержит структуры? Моя первая попытка псевдокода выглядит следующим образом:

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

Проблема здесь в том, что предикат не отображается непосредственно в списке, а внутри event.object.return_number(). Как я полагаю, что я ссылаюсь на int, который вложен в структуру и нуждается в методе get для доступа.

Ответы [ 4 ]

2 голосов
/ 22 октября 2010

Вы можете использовать класс функтора (который похож на функцию, но позволяет вам иметь состояние, такое как конфигурация):

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 голосов
/ 22 октября 2010

В C ++ 0x, который ваш компилятор, вероятно, уже частично реализует, вы можете сделать следующее:

find_if(cal.begin(), cal.last(), [&](const Event& e) 
        { 
            return e.object.return_number() == value_to_find;
        });
1 голос
/ 22 октября 2010

Вы настроили свой предикат примерно так:

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));
0 голосов
/ 22 октября 2010

(не такой простой, но) простейший способ (в отсутствие 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));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...