Правильная реализация мин - PullRequest
16 голосов
/ 13 ноября 2010

Во время 0:43:15 в этом Tech-Talk о D , обсуждается реализация функции min. В качестве одной из причин показанной реализации предложены опасения по поводу «стабильности» и «дополнительной перестановки (если значения равны)» при использовании в некоторых алгоритмах.

Может ли кто-нибудь предоставить реальный / практический вариант использования (или предоставить более подробное объяснение), где эта конкретная реализация min является "стабильной" (или лучше), в отличие от ее другой возможной реализации? Или это просто еще один пример того, как альфа-гики зашли слишком далеко?

Рекомендуемая реализация:

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 предоставляет реализации, основанные на последнем, обратите внимание, что на данный момент предложение не было успешным.

Другие соответствующие предложения, касающиеся мин / макс: N1840 , N2485 и N2551

Ответы [ 2 ]

37 голосов
/ 13 ноября 2010

В этом случае я почти уверен, что «стабильный» относится к стабильному, так как он применяется при сортировке - то есть, когда / если два элемента равны, они остаются отсортированными в том же порядке, в котором они начинались с , Для этого вы хотите вернуть lhs, когда оно меньше или равно rhs - но в C ++ вы (обычно) хотите сделать это, используя только operator<, независимо от наличия operator<=.

0 голосов
/ 24 марта 2013

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

Если для большинства случаев использования ожидаемый минимум составляет rhs, выберите первую реализацию. Если это lhs, выберите вторую реализацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...