4 ответов:
Предикат-это функция C++, возвращающая логическое значение или экземпляр объекта, имеющего член bool operator (). Унарный предикат возьмем один, бинарный-два и т. д. Примерами вопросов, на которые предикаты могут ответить для конкретного алгоритма, являются:
Является ли этот элемент тем, что мы ищем? Является ли первый из двух аргументов первым в нашем порядке?
- равны ли эти два аргумента?
Почти все алгоритмы STL принимают предикат за последний аргумент.
Вы можете построить новые предикаты, используя стандартные, ваши собственные и предикатные классы ( вот хорошая ссылка).
Стандарт C++ определяет
Predicate
следующим образом (25/7):Существует аналогичное определениеИспользуется параметр предиката всякий раз, когда алгоритм ожидает объект функции, который при применении к результат разыменования соответствующий итератор возвращает значение проверяемо как истина. Другими словами, если алгоритм принимает предикат pred как его аргумент и первый в качестве итератора аргумент, он должен работать правильно в конструкция
if (pred(*first)){...}
. Функциональный объектpred
не должен применять какие-либо непостоянная функция через разыменованный итератор. Этот объект функции может быть указателем чтобы функционировать, или объект типа с соответствующим вызовом функции оператор.BinaryPredicate
с двумя параметрами.Итак, в английском языке это функция или объект с перегрузкой
operator()
, которая:
- принимает один параметр. В случае алгоритмов тип параметра неявно преобразуется из типа разыменованный итератор рассматриваемого алгоритма или является постоянной ссылкой на такой тип, или при нажатии он может быть неконстантной ссылкой на точный тип, если итератор не является const_iterator.
- возвращает значение, которое может быть проверено на истинность в операторе
if
(и, следовательно, из-за правил языка C++, также в циклеwhile
и так далее).- не изменяет свои аргументы (по крайней мере, пока тип параметра является const-корректным...)
Дополнительно, поскольку многие алгоритмы не задают точный порядок выполняемых ими операций, вы можете обнаружить, что получите непредсказуемое поведение, если ваш предикат не согласован, то есть если результат зависит от чего-либо, кроме входного значения, которое может изменяться между вызовами.
Так же как и алгоритмы, логический отрицатель
not1
в<functional>
принимает параметр шаблонаPredicate
. В этом случае существует дополнительное требование (20.3 / 5):Для включения адаптеров и других устройств компоненты к манипулировать функцией объекты, принимающие один или два аргумента требуется, чтобы функция объекты соответственно обеспечивают typedefs argument_type и result_type для функциональных объектов, которые принимают один аргумент и first_argument_type, second_argument_type, и result_type для функциональных объектов, которые принимают два аргументы.
Предикат-это просто функция, которая возвращает true или false в зависимости от того, удовлетворяют ли ее входные данные некоторому условию. В общем случае функция предиката должна быть чистой ; она должна Всегда возвращать один и тот же результат, когда заданы одни и те же входные данные (поэтому
bool isDateInPast(Date &date)
будет плохим предикатом).Они часто используются, например, в качестве обратных вызовов для процедур сортировки STL (т. е. "является ли input
a
меньше inputb
?").
Он не является специфичным для C++ (или даже компьютерных языков). В грамматике естественного языка, в таком утверждении, как ворота открыты, Часть открыта является предикатом и является либо истинной, либо ложной, поэтому предположим, что у вас есть класс
По существу, если функция задает вопрос о состоянии или значении объекта и результат является либо истинным, либо ложным, то это предикат.cGate
, с функцией-членомbool cGate::isOpen()
, такая функция будет предикатом.
Comments