Компаратор с нестрогим сравнением в std::sort
Сортировка задач по приоритету изредка падает прямо внутри std::sort:
std::sort(tasks.begin(), tasks.end(),
[](const Task& a, const Task& b) { return a.priority <= b.priority; });
Чем больше в массиве одинаковых приоритетов, тем чаще падение. В чём причина?
- Лямбда принимает аргументы по константной ссылке, поэтому `std::sort` не может переставлять элементы и портит соседнюю память
- `std::sort` не работает с лямбдами: компаратор нужно передавать как функциональный объект с `operator()` либо обернуть в `std::function`
- Дело в нестабильности `std::sort`: равные элементы он переставляет произвольно, поэтому для одинаковых приоритетов нужен `std::stable_sort`
- Компаратор должен задавать строгий порядок: на равных элементах он обязан вернуть `false`, иначе `std::sort` выходит за границы диапазона
