Несмотря на то, что справиться со стандартом - это хорошо, понять его иногда бывает довольно сложно ...
Попытка в более простых словах:
Если вы хотите отсортировать элементы, вам нужно какое-то отношение порядка, которое определяет, какой из двух элементов должен стоять первым («будь меньшим»). Некоторые типы данных имеют естественный порядок, например целые числа, например: -12 <-10 - 0 - 10 <12. <code>std::sort (без параметра сравнения) использует этот естественный порядок для сортировки элементов по возрастанию.
Третий параметр дает вам возможность std::sort
явно указать, как этот порядок будет определен, представьте следующее:
std::vector v({12, 7, 10});
std::sort(v.begin(), v.end(), [](int x, int y){return x > y;});
Выглядит неестественно, не так ли? std::sort
интерпретирует сравнение как «меньше», но мы реализовали «больше»! Таким образом, большие значения (которые считаются «меньшими») сортируются перед более мелкими (считаются «большими»), поэтому мы достигли сортировки в порядке по убыванию ...
Таким образом, параметр сравнения, переданный в std::sort
, используется либо для сортировки по-другому, чем естественный порядок, либо для явного определения порядка для типов данных, где такой порядок не существует.
Примечание: отношение заказа не обязательно должно быть общим заказом; однако эквивалентные элементы затем могут быть отсортированы в произвольном порядке (хотя вы могли бы вместо этого использовать std::stable_sort
, чтобы хотя бы сохранить их относительный порядок перед сортировкой):
int a[12, 7, 10, 7];
std::vector<int*> v({&a[0], &a[1], &a[2], &a[3]});
std::sort(v.begin(), v.end(), [](int* x, int* y) { return *x < *y; });
// v[2] == &a[2]
// v[3] == &a[1]
// BUT:
// v[0] == &a[1] && v[1] == &a[3] || v[0] == &a[3] && v[1] == &a[1]