2010-11-13 7 views
14

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

+6

Я не понимаю. Я не вижу никакого преимущества для одной из реализаций, которые вы показываете. В какой-то момент один из них должен быть выбран ... –

+1

Мне очень интересно, как вопрос о очень узком фокусе и ограниченной применимости оценивается чрезвычайно высоко, когда вопрос очень широкого внимания и применимый практически ко всем, называется «офф- тема. Я знаю, что в программировании детали могут быть чрезвычайно важными. Но это очень узко важно, и я никогда не буду зависеть от стабильности мин, чтобы быть правильным в коде, который я написал, потому что это слишком крошечная деталь, чтобы зависеть от того, кто прав. – Omnifarious

+5

@Omnifarious: Я думаю, вы неправильно поняли проблему, ее не о чем-то тривиальном, а скорее о проблеме, которая преследует C++ в течение последних 10 лет, но для этого один из мировых экспертов на этом языке и некоторые люди в несколько престижная организация, такая как Google, сделала комментарий и сделала звук нормальным и «фактически фактом», когда большинство в отрасли согласилось с обратным, что не может не задаться вопросом, является ли это еще одним Kepler или Ситуация Галилея, называющая мир вокруг ... Скорее всего, все это просто чушь, но почему бы не обсудить это? – 2010-11-14 02:14:58

ответ

35

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

-3

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

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

+0

Прогнозирование ветвей может предсказать ложь так же полезно, как и истины. – Puppy

Смежные вопросы