понимание предиката find_if

Я просматривал следующий пример, который я получил из другого поста SO.The пример что-то вроде этого

class checker
{
public:
bool operator()(unsigned int i)
{
if (i%2 == 0)
{
return true;   --------------->Statement A
}
return false;

}
};

std::vector<int> vec;
vec.push_back(3);
vec.push_back(5);
vec.push_back(2);
if(std::find_if(vec.begin(), vec.end(), checker()) != vec.end())
{
std::cout << "Found";
}

Теперь у меня есть три вопроса относительно приведенного выше примера:

Q1- 3-й параметр find_if принимает предикат. Здесь я использую объект функтора. Предполагается ли, что предикат будет указателем (адресом) или объектом. Здесь я передаю объект, однако в этом примере на MSDN это передача адреса. Я понимаю, что в этом примере предикат не является методом-членом класса. Однако я все еще был бы признателен, если бы кто-то смог уточнить здесь требование к параметру предиката. Потому что, если он может принимать указатели на функции, то это не работает

bool (checker::*aptr)(unsigned int) = NULL;  //Function ptr of class method
aptr = &(checker::operator());
if(std::find_if(vec.begin(), vec.end(), aptr) != vec.end()){...};

Q2 — Хотя приведенный выше пример работает нормально, однако, когда я ставлю точку останова в операторе A, точка останова никогда не получает попаданий, и, как предполагалось, вернула истину. Разъяснение по этому вопросу было бы полезно.

Q3- Некоторые примеры получили структуру / класс из std::unary_function<key_struct, bool> В чем причина этого. Класс выше работает хорошо для меня. Почему необходимо извлечь его из std::unary_function<key_struct, bool> ?

0

Решение

  1. Аргументом предиката может быть что угодно, что можно вызвать как функцию с соответствующим аргументом и вернуть что-то, что можно преобразовать в bool, Это может быть объект функции, то есть объект класса с оператором вызова функции или указатель функции. Если вы не модифицируете свой объект, вы, вероятно, должны сделать оператор вызова функции const,
  2. я мог бы Угадай что оператор функции заканчивается тем, что он встроен, и вы ставите точку останова в автономную версию объекта функции. Установка точек останова с помощью встроенных функций может быть сложной задачей. Возможно, вы захотите попробовать сделать функцию не встроенной для тестирования. Для производственных целей вы хотите сделать большинство предикатов inline потому что есть огромная разница в производительности.
  3. При использовании адаптеров функциональных объектов, например, std::not1() с функциональным объектом им нужно было определить определенные вложенные типы. Для нормальных функций соответствующие ассоциированные типы, например, тип возвращаемого значения и типы аргумента, могут быть легко выведены. Для объектов функций они не могут быть выведены в C ++ 03. В C ++ 11 все вложенные типы не нужны (если я правильно помню). В любом случае, std::find_if() не нужно возиться с объектом функции после его вызова, т. е. ни один из вложенных типов на самом деле не нужен.

Кстати, есть ли причина, по которой ваш предикат не просто возвращает результат выражения? То есть я бы реализовал это так:

struct checker {
bool operator()(unsigned int i) const { return (i % 2) == 0; }
};
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]