Подтвердить что ты не робот

Что такое предикат в С++?

Можете ли вы привести пример или ссылку на тему.

4b9b3361

Ответ 1

Предикат - это функция C++, возвращающая логическое значение или объект, имеющий член bool operator(). Унарный предикат принимает один аргумент, двоичный - два, и так далее. Примеры предикатов вопросов, на которые может ответить конкретный алгоритм:

  • Этот элемент - то, что мы ищем?
  • Первый из двух аргументов упорядочен первым в нашем порядке?
  • Два аргумента равны?

Почти все алгоритмы STL принимают предикат в качестве последнего аргумента.

Вы можете создавать новые предикаты, используя стандартные, самоопределяемые и/или классы, создающие предикаты (вот хорошая ссылка).

Ответ 2

Стандарт С++ определяет Predicate следующим образом (25/7):

Используется параметр Predicate всякий раз, когда алгоритм ожидает функциональный объект, который применяется при результат разыменования соответствующий итератор возвращает значение проверяемый как истинный. Другими словами, если алгоритм берет Predicate pred as его аргумент и сначала как его итератор аргумент, он должен корректно работать в конструкция if (pred(*first)){...}. Объект функции pred не должен применить любую непостоянную функцию через разыменованный итератор. Этот функциональный объект может быть указателем функции или объекта типа с соответствующим вызовом функции Оператор.

Существует аналогичное определение BinaryPredicate с двумя параметрами.

Итак, на английском языке это функция или объект с перегрузкой operator(), которая:

  • принимает один параметр. В случае алгоритмов тип параметра неявно конвертируется из типа разыменованного итератора рассматриваемого алгоритма или является константой ссылки на такой тип или при нажатии это может быть неконстантная ссылка на точный тип, пока итератор не является const_iterator.
  • возвращает значение, которое может быть проверено на истинность в выражении if (и, следовательно, из-за правил языка С++, также в цикле while и т.д.).
  • не изменяет свои аргументы (по крайней мере, не до тех пор, пока тип параметра const-correct...)

Кроме того, поскольку многие алгоритмы не определяют точный порядок операций, которые они выполняют, вы можете обнаружить, что вы получаете непредсказуемое поведение, если ваш предикат не согласован, т.е. если результат зависит от чего-либо, кроме входного значения, которое может изменение между вызовами.

Как и алгоритмы, логический отрицатель not1 в <functional> принимает параметр шаблона Predicate. В этом случае существует дополнительное требование (20.3/5):

Чтобы включить адаптеры и другие компоненты для управления функциями объекты, которые принимают один или два аргумента требуется, чтобы функция объекты соответственно обеспечивают typedefs аргумент_type и result_type для объектов функций, которые принимают один аргумент и first_argument_type, second_argument_type и result_type для объектов функций, которые принимают два Аргументы.

Ответ 3

Предикат - это просто функция, которая возвращает true или false в зависимости от того, удовлетворяет ли ее вход (-ы) некоторым условием. В общем случае функция предиката должна быть чистой; он всегда должен возвращать тот же результат при задании одного и того же ввода (поэтому bool isDateInPast(Date &date) будет плохим предикатом).

Они часто используются, например, как обратные вызовы для процедур сортировки STL (т.е. "вводится a меньше, чем вход b?" ).

Ответ 4

Это не относится к С++ (или даже к компьютерным языкам). В грамматике естественного языка в заявлении, таком как ворота, открыто, открытая часть является предикатом и является либо истинным, либо ложным, поэтому скажите, что у вас есть класс cGate с функцией-членом bool cGate::isOpen(), такая функция будет предикатом.

По сути, если функция задает вопрос о состоянии или значении объекта, и результат является либо истинным, либо ложным, то это предикат.