Страницы

Поиск по вопросам

понедельник, 1 октября 2018 г.

Что такое предикатная функция?

Изучаю С++. В литературе одну из функций назвали предикатной. Что это может значить, или это такой перевод ?


Ответ

Давайте рассмотрим такую задачу. У нас есть, скажем, вектор целых чисел, и мы хотим вывести на экран только положительные числа.
Как мы это сделаем?
void out(const vector& v) { for(auto i: v) if (i > 0) cout << i << " "; }
А если вывести все, больше 5?
void out(const vector& v) { for(auto i: v) if (i > 5) cout << i << " "; }
Похоже? Да. Так и тянет объединить их в
void out(const vector& v, int value) { for(auto i: v) if (i > value) cout << i << " "; }
Но что, если мы захотим вывести только четные? Только те, для которых синус положителен?
Все это можно обобщить, например, так:
void out(const vector& v, bool(*)(int) pred) { for(auto i: v) if (pred(i)) cout << i << " "; }
Где pred - функция, которая проверяет некоторое условие, предикат. И будут выведены только те числа, для которых функция pred вернет значение true. А как мы ее напишем - наше дело. Например,
bool pred(int i) { return i > 5; }
Вот, по сути, и все. Остальное - функция, или лямбда, шаблон или нет, от скольки аргументов и т.д. и т.п. - не суть важно. Предикативная функция - проверяющая некоторое условие, предикат, для своего(их) аргумента(ов).
Ну и - предикаты весьма широко применяются в алгоритмах стандартной библиотеки.

Комментариев нет:

Отправить комментарий