Подтвердить что ты не робот

Почему std:: max возвращает неправильное значение?

В разделе Grill the Committee из CppCon 2014 член комитета Уолтер Браун упомянул, что std:: max возвращает неправильное значение в что оба аргумента имеют равное значение.

Это было принято без комментариев и не уточнено. Что он имел в виду под этим? Зачем это важно, какое значение возвращается?

4b9b3361

Ответ 1

Если min и max используются только для упорядоченных множеств, все разумные определения эквивалентны.

Однако на практике min и max используются на предварительно упорядоченных наборах: наборы, в которых у вас могут быть два элемента, которые сортируют одинаковые, не будучи идентичными. Например, вы можете манипулировать:

struct student {
    char *name;
    int grade;
};

и определите s1 < s2, когда strcmp(s1->name, s2->name) < 0. Тогда два ученика с тем же именем, но с разными классами будут сортироваться одинаково. Такие два элемента называются эквивалентными для отношения (pre) порядка.

В предварительно упорядоченном наборе аргумент min двух эквивалентных элементов должен возвращать первый параметр, а max должен возвращать второй. Это определение сохраняет несколько свойств, которые вы ожидаете, особенно

  • пара (min(x,y), max(x,y)) либо (x, y), либо (y, x),

и

  • если x и y различны, то min(x,y) и max(x,y) различны,

и

  • функция, которая отображает (x, y) в (min(x,y), max(x,y)), является стабильной функцией сортировки для множеств из двух элементов.

Это не новая идея, и вы найдете способы лучше объяснений, чем мои, в ряде стандартных текстов по программированию. Глава 7 из Степановских статей, уже цитированная Mat и juanchopanza, является хорошим источником, если вам нравится синтаксис С++.