Ответ
Для использования в std::sort оператор сравнения (по умолчанию operator<) должен моделировать строгий слабый порядок (strict weak ordering). Это означает, что для любых элементов a, b и c должны выполняться следующие условия:
- Антирефлексивность:
!(a < a)— элемент не меньше себя самого. - Асимметричность: если
a < b, то!(b < a). - Транзитивность: если
a < bиb < c, тоa < c. - Транзитивность эквивалентности: если
aиbнесравнимы (!(a < b) && !(b < a)) иbиcнесравнимы, тоaиcтакже должны быть несравнимы.
Нарушение этих правил, например, использование оператора <=, приводит к неопределенному поведению (undefined behavior).
Пример корректного компаратора для сортировки структур:
struct Point {
int x, y;
};
bool compareByX(const Point& a, const Point& b) {
// Строгий слабый порядок по полю x
return a.x < b.x;
}
int main() {
std::vector<Point> points = {{2, 5}, {1, 3}, {2, 1}};
std::sort(points.begin(), points.end(), compareByX);
// Результат: {1,3}, {2,5}, {2,1}
}