В чем разница между компаратором и предикатом?

В интернете я нашел такие определения

Компаратор — это функция, которая используется для сравнения элементов.

Предикат — это функция, возвращающая логическое значение.

Судя из определений, предикатом является любая булевая функция, а компаратор это некое подмножество предиката, которое занимается именно сравнением (что логично, так как англ. "compare" означает "сравнивать").

Но я не понимаю, почему, например, в std::sort используют Compare, а в std::count_if используют Predicate, хотя и там и там идет сравнение элементов.


И собственно вопрос: когда и что правильнее называть компаратором, а когда и что предикатом?


Ответы (3 шт):

Автор решения: HolyBlackCat

Вы поняли правильно, компараторы - подмножество предикатов.

а в std::count_if используют Predicate, хотя и там и там идет сравнение элементов.

Сравнение чего с чем? Там у предиката один аргумент, а компаратор должен сравнивать два.

→ Ссылка
Автор решения: MBo

Компаратору нужно отношение порядка (strict weak ordering) (например, возможность сравнения "меньше или равно"). Это как раз то, что требуется в сортировке. Заметьте, что не для всех объектов возможно установление порядка (в т.ч. транзитивное отношение).

count_if может использовать любой предикат, например, на вхождение в некое множество, на равенство (equivalence relationship), или то же самое сравнение порядка с неким значением с помощью компаратора

→ Ссылка
Автор решения: Stanislav Volodarskiy

Предикат - функция возвращающая булево значение.

Компаратор - функция сравнивающая два значения и возвращающая что-то про их порядок.

Компаратор может не быть предикатом. Например, qsort использует компаратор int (*comp)(const void*, const void*). Он возвращает целые числа, которые описывают порядок аргументов. Если число отрицательное, первый аргумент меньше второго. Если положительное, первый аргумент больше второго. Если ноль, аргументы равны. comp - компаратор (он сравнивает), но не предикат (значения не булевы).

Компаратор может быть предикатом. Например, std::sort может использовать компаратор bool cmp(const Type1& a, const Type2& b), который и предикат.

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

И конечно бывают не предикаты не компрараторы. пример приводить не буду.

Итого:

  1. никакой связи между предикатами и компараторами нет;
  2. часто встречаются компараторы-предикаты.

:)

→ Ссылка