В документации для std::sort
( здесь среди других мест) говорится что-то вроде
Сортирует элементы в диапазоне [первый, последний) в порядке возрастания.
Это удобное упрощение, но оно сбивает с толку, когда вы не хотите по возрастанию.
Полезнее думать, что sort
реорганизует ваш диапазон в соответствии с некоторой функцией - назовем ее pre
- которая говорит для любой пары элементов, какой из них должен предшествовать (предшествовать) другому.
То есть функция выглядит примерно так:
bool pre(int a, int b); // return true if a should precede b
Поведение по умолчанию , если вы не укажете что-то другое, заключается в использовании std::less
, что примерно так и сделает:
bool less(int a, int b) { return a<b; }
и это значение по умолчанию (где меньшее значение всегда предшествует большему) дает результат, отсортированный в порядке возрастания.
Если вы укажете std::greater
, вы говорите, что большее значение всегда должно предшествовать меньшему (потому что если greater(a,b)==true
, это означает, что a>b
, а также что a
будет предшествовать b
в выводе).
Итак, это то же самое, что сказать, что результат отсортирован в порядке убывания.
NB. Я назвал сравнение pre
и потому, что оно говорит вам, какие элементы должны предшествовать каким, а также потому, что это предикат (в частности, BinaryPredicate и даже больше в частности, Сравнение ).