Я укажу, что это согласуется с другими частями std
, такими как sort
и map
, которые все упорядочивают на основе функтора, который удовлетворяет Сравните . Один и тот же вопрос может быть распространен на все эти вещи.
В чем причина?
Первоначальный автор и комитет по стандартам считали, что это более естественный способ выражения порядка.
Есть некоторые проблемы с использованием трехстороннего сравнения через int
.
int
имеет более трех значений. Поэтому вы должны сделать дополнительную арифметику возвращаемого значения.
- Легче попасть в неопределенное поведение
struct three_way_compare
{
int operator()(int lhs, int rhs) { return lhs - rhs; }
// Undefined behaviour when rhs is a large positive value and lhs is a large negative value
}
Вы можете синтезировать трехстороннее сравнение, дважды позвонив вашему функтору. Ссылка определяет требования, используя
equiv(a, b)
, выражение, эквивалентное !comp(a, b) && !comp(b, a)
Обратите внимание, что для C ++ 20 в язык добавляется трехстороннее сравнение с operator <=>
. Я не уверен, изменяются ли существующие алгоритмы, чтобы использовать их, когда они доступны.