Вступить в клуб →
средняявопросSTL и контейнеры

Компаратор с нестрогим сравнением в 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` выходит за границы диапазона

🔒 Проверка ответа — для участников клуба

  • Проверка ответа
  • Подсказка, если застряли
  • Разбор с объяснением, почему так
  • Прогресс по всем задачам и виртуальные собеседования
Зарегистрироваться →

Регистрация занимает минуту

Другие задачи раздела