В чем разница между компаратором и предикатом?
В интернете я нашел такие определения
Компаратор — это функция, которая используется для сравнения элементов.
Предикат — это функция, возвращающая логическое значение.
Судя из определений, предикатом является любая булевая функция, а компаратор это некое подмножество предиката, которое занимается именно сравнением (что логично, так как англ. "compare" означает "сравнивать").
Но я не понимаю, почему, например, в std::sort используют Compare
, а в std::count_if используют Predicate
, хотя и там и там идет сравнение элементов.
И собственно вопрос: когда и что правильнее называть компаратором, а когда и что предикатом?
Ответы (3 шт):
Вы поняли правильно, компараторы - подмножество предикатов.
а в std::count_if используют Predicate, хотя и там и там идет сравнение элементов.
Сравнение чего с чем? Там у предиката один аргумент, а компаратор должен сравнивать два.
Компаратору нужно отношение порядка (strict weak ordering) (например, возможность сравнения "меньше или равно"). Это как раз то, что требуется в сортировке. Заметьте, что не для всех объектов возможно установление порядка (в т.ч. транзитивное отношение).
count_if
может использовать любой предикат, например, на вхождение в некое множество, на равенство (equivalence relationship), или то же самое сравнение порядка с неким значением с помощью компаратора
Предикат - функция возвращающая булево значение.
Компаратор - функция сравнивающая два значения и возвращающая что-то про их порядок.
Компаратор может не быть предикатом. Например, qsort использует компаратор int (*comp)(const void*, const void*)
. Он возвращает целые числа, которые описывают порядок аргументов. Если число отрицательное, первый аргумент меньше второго. Если положительное, первый аргумент больше второго. Если ноль, аргументы равны. comp
- компаратор (он сравнивает), но не предикат (значения не булевы).
Компаратор может быть предикатом. Например, std::sort может использовать компаратор bool cmp(const Type1& a, const Type2& b)
, который и предикат.
Предикат может не быть компаратором. Например, любая булева функция с одним аргументом точно предикат и точно не компаратор.
И конечно бывают не предикаты не компрараторы. пример приводить не буду.
Итого:
- никакой связи между предикатами и компараторами нет;
- часто встречаются компараторы-предикаты.
:)