Правильная реализация мин.
В данный момент 0:43:15 в этом Tech-Talk о D, обсуждается реализация функции min. Озабоченность по поводу "стабильности" и "дополнительной перетасовки (если значения равны)", когда используется в некоторых алгоритмах (ах), предлагается в качестве одной из причин показанной реализации.
Может ли кто-либо предоставить реальный/практический вариант использования (или предоставить более подробное объяснение), где эта конкретная реализация min является "стабильной" (ака лучше), а не ее другой возможной реализацией? Или это просто еще один пример альфа-geeks, который слишком далеко?
Рекомендуемая реализация:
template <class LHS, class RHS, class Return>
inline Return min(LHS& lhs, RHS& rhs)
{
return (rhs < lhs) ? rhs : lhs;
}
Другая возможная реализация:
template <class LHS, class RHS, class Return>
inline Return min(LHS& lhs, RHS& rhs)
{
return (lhs < rhs) ? lhs: rhs;
}
Предложение N2199 предоставляет реализации, основанные на последних, обратите внимание, что предложение не было успешным в настоящее время.
Другие актуальные предложения, касающиеся min/max, N1840, N2485 и N2551
Ответы
Ответ 1
В этом случае я уверен, что "стабильный" ссылается на стабильный, как он применяется при сортировке, т.е. когда/если два элемента равны, они остаются отсортированными в том же порядке, в каком они начинались с, Для этого вы хотите вернуть lhs
, когда оно меньше или равно rhs
, но в С++ вы (обычно) хотите сделать это, используя только operator<
, не зависимо от наличия operator<=
.
Ответ 2
В общем случае нет преимущества для одной реализации над другой.
Если вы используете min
для конкретного использования, может быть целесообразно выбрать одну из форм на основе данных, к которым она будет применяться, чтобы максимально использовать предсказания ветвей.
Если для большинства случаев использования ожидаемый минимум равен rhs
, выберите первую реализацию.
Если он lhs
, выберите вторую реализацию.