Выбор ответа Middle Алгоритмы STL и ranges спрашивают часто обновлено

Компаратор с <=

Вопрос

Что не так с std::sort(v.begin(), v.end(), [](int a, int b) { return a <= b; });?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Нет строгого слабого порядка: это UB, возможен выход за границы массива. Требование comp(a, a) == false нарушено.

Варианты ответа

  1. Нет строгого слабого порядка: это UB, возможен выход за границы массиваправильный ответ
  2. Сортировка будет по убыванию, так как <= инвертирует порядок
  3. Ничего: для сортировки <= эквивалентен <, равные не важны
  4. Не скомпилируется: std::sort требует компаратор без =

Разбор

Требование comp(a, a) == false нарушено. Реализация introsort полагается на него в неохраняемых циклах и при большом числе одинаковых элементов может прочитать за пределами массива. Правильно: a < b.

  • Убывание дал бы a > b (или std::greater<>).
  • На различных элементах результат часто совпадает, поэтому ошибка живёт до первых дубликатов.
  • Компилятор такое не ловит.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.