Это в основном сводится к тому, как эти функции определены в стандарте. std::max
, например, определяет компаратор (вашу лямбду) следующим образом:
объект функции сравнения (т.е. объект, который удовлетворяет требованиям Compare), который возвращает true если a меньше, чем b.
Обычно, когда речь идет о порядке значений в стандартной библиотеке c ++, это (почти?) всегда std::less
, который используется в качестве компаратора по умолчанию, который выполняет точно left < right
.
Относительно того, почему всегда нужно удовлетворять a < b
. Я думаю, что это просто уменьшит накладные расходы на кодирование, если вы сами напишите это. Представьте себе такой компаратор, как этот:
struct MyComp
{
bool operator()(MyType a, MyType b) const
{
return a.getValue() < b.getValue();
}
};
Поскольку все конструкции в стандартной библиотеке требуют, чтобы ваш компаратор возвращал значение true, если a < b
, вы можете использовать один простой компаратор для множества конструкций. Например,
auto maxVal = std::max(a, b, MyComp{});
auto minVal = std::min(a, b, MyComp{});
std::map<MyType, MyComp> myMap;
будет работать только с одним компаратором.