Использование минуты и макс. функций в C++

Я люблю способ, которым SubSonic делает один столбец только вещь.
Или

DataBaseTable.GetList(DataBaseTable.Columns.ColumnYouWant)

, или:

Query q = DataBaseTable.CreateQuery()
               .WHERE(DataBaseTable.Columns.ColumnToFilterOn,value);
q.SelectList = DataBaseTable.Columns.ColumnYouWant;
q.Load();

, Но Linq все еще король когда дело доходит до ленивой загрузки.

69
задан Chris Frederick 4 October 2011 в 06:18
поделиться

10 ответов

fmin и fmax специально предназначены для использования с числами с плавающей запятой (отсюда и "f"). Если вы используете его для целых чисел, вы можете понести потери производительности или точности из-за преобразования, накладных расходов на вызов функций и т. Д. В зависимости от вашего компилятора / платформы.

std :: min и std :: max - это шаблонные функции (определенные в заголовке ), которые работают с любым типом с оператором «меньше чем» ( <), поэтому они могут работать с любым типом данных, который позволяет такое сравнение. Вы также можете предоставить свою собственную функцию сравнения, если не хотите, чтобы она работала с <.

Это безопаснее, поскольку вам нужно явно преобразовать аргументы для сопоставления, если они имеют разные типы. Например, компилятор не позволит вам случайно преобразовать 64-битное int в 64-битное float. Уже по этой причине шаблоны должны быть выбраны по умолчанию. (Кредит Matthieu M & bk1e)

Даже при использовании с поплавками шаблон может выиграть в производительности. Компилятор всегда имеет возможность встраивать вызовы шаблонных функций, поскольку исходный код является частью модуля компиляции. С другой стороны, иногда невозможно встроить вызов библиотечной функции (совместно используемые библиотеки, отсутствие оптимизации времени компоновки и т. Д.).

Это безопаснее, поскольку вам нужно явно преобразовать аргументы для сопоставления, если они имеют разные типы. Например, компилятор не позволит вам случайно преобразовать 64-битное int в 64-битное float. Уже по этой причине шаблоны должны быть выбраны по умолчанию. (Кредит Matthieu M & bk1e)

Даже при использовании с числами с плавающей запятой шаблон может выиграть в производительности. Компилятор всегда имеет возможность встраивать вызовы шаблонных функций, поскольку исходный код является частью модуля компиляции. Иногда, с другой стороны, невозможно встроить вызов библиотечной функции (совместно используемые библиотеки, отсутствие оптимизации времени компоновки и т. Д.).

Это безопаснее, так как вам нужно явно преобразовать аргументы для сопоставления, если они имеют разные типы. Например, компилятор не позволит вам случайно преобразовать 64-битное int в 64-битное float. Уже по этой причине шаблоны должны быть выбраны по умолчанию. (Кредит Matthieu M & bk1e)

Даже при использовании с числами с плавающей запятой шаблон может выиграть в производительности. Компилятор всегда имеет возможность встраивать вызовы шаблонных функций, поскольку исходный код является частью модуля компиляции. Иногда, с другой стороны, невозможно встроить вызов библиотечной функции (совместно используемые библиотеки, отсутствие оптимизации времени компоновки и т. Д.).

t позволяет, например, случайно преобразовать 64-битное int в 64-битное float. Уже по этой причине шаблоны должны быть выбраны по умолчанию. (Кредит Matthieu M & bk1e)

Даже при использовании с поплавками шаблон может выиграть в производительности. Компилятор всегда имеет возможность встраивать вызовы шаблонных функций, поскольку исходный код является частью модуля компиляции. С другой стороны, иногда невозможно встроить вызов библиотечной функции (совместно используемые библиотеки, отсутствие оптимизации времени компоновки и т. Д.).

t позволяет, например, случайно преобразовать 64-битное int в 64-битное float. Уже по этой причине шаблоны должны быть выбраны по умолчанию. (Кредит Matthieu M & bk1e)

Даже при использовании с поплавками шаблон может выиграть в производительности. Компилятор всегда имеет возможность встраивать вызовы шаблонных функций, поскольку исходный код является частью модуля компиляции. Иногда, с другой стороны, невозможно встроить вызов библиотечной функции (совместно используемые библиотеки, отсутствие оптимизации времени компоновки и т. Д.).

Компилятор всегда имеет возможность встраивать вызовы шаблонных функций, поскольку исходный код является частью модуля компиляции. С другой стороны, иногда невозможно встроить вызов библиотечной функции (совместно используемые библиотеки, отсутствие оптимизации времени компоновки и т. Д.).

Компилятор всегда имеет возможность встраивать вызовы шаблонных функций, поскольку исходный код является частью модуля компиляции. Иногда, с другой стороны, невозможно встроить вызов библиотечной функции (совместно используемые библиотеки, отсутствие оптимизации времени компоновки и т. Д.).

107
ответ дан 24 November 2019 в 13:41
поделиться

fmin и fmax предназначены только для переменных с плавающей запятой и double.

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

1
ответ дан 24 November 2019 в 13:41
поделиться

Я всегда использую макросы min и max для целых чисел. Я не уверен, зачем кому-то использовать fmin или fmax для целочисленных значений.

Большая проблема с min и max заключается в том, что они не являются функциями, даже если они похожи на них. Если вы сделаете что-то вроде:

min (10, BigExpensiveFunctionCall())

Этот вызов функции может вызываться дважды в зависимости от реализации макроса. Поэтому в моей организации лучше всего никогда не вызывать min или max с вещами, которые не являются литералами или переменными.

0
ответ дан 24 November 2019 в 13:41
поделиться

std :: min и std :: max являются шаблонами. Таким образом, их можно использовать для различных типов, которые предоставляют оператор «меньше чем», включая числа с плавающей запятой, двойные, длинные двойные. Итак, если вы хотите написать общий код на C ++, вы бы сделали что-то вроде этого:

template<typename T>
T const& max3(T const& a, T const& b, T const& c)
{
   using std::max;
   return max(max(a,b),c); // non-qualified max allows ADL
}

Что касается производительности, я не думаю, что fmin и fmax отличаются от своих аналогов на C ++. .

6
ответ дан 24 November 2019 в 13:41
поделиться

Я бы предпочел функции C ++ min / max, если вы используете C ++, потому что они зависят от типа. fmin / fmax заставит все преобразовать в / из чисел с плавающей запятой.

Кроме того, функции C ++ min / max будут работать с определяемыми пользователем типами, если вы определили operator <для этих типов.

HTH

4
ответ дан 24 November 2019 в 13:41
поделиться

Используйте std :: min и std :: max .

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

template <typename T>
T min (T, T) {
  // ... default
}

inline float min (float f1, float f2) {
 return fmin( f1, f2);
}    
1
ответ дан 24 November 2019 в 13:41
поделиться

Как вы сами заметили, fmin и fmax были введены в C99. Стандартная библиотека C ++ не имеет функций fmin и fmax . Пока стандартная библиотека C99 не будет включена в C ++ (если вообще когда-либо), области применения этих функций четко разделены. Нет ситуации, когда вам, возможно, пришлось бы «предпочитать» одно другому.

Вы просто используете шаблонный std :: min / std :: max в C ++ и используете все, что доступно на C.

2
ответ дан 24 November 2019 в 13:41
поделиться

Если ваша реализация предоставляет 64-битный целочисленный тип, вы можете получить другой (неправильный) ответ, используя fmin или fmax. Ваши 64-битные целые числа будут преобразованы в двойные, которые (по крайней мере, обычно) будут иметь значение меньше 64-битного. Когда вы конвертируете такое число в двойное, некоторые из наименее значимых битов могут / будут полностью потеряны.

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

6
ответ дан 24 November 2019 в 13:41
поделиться

fmin и fmax , из fminl и fmaxl могут быть предпочтительнее при сравнении целых чисел со знаком и без знака - вы Вы можете воспользоваться тем фактом, что весь диапазон чисел со знаком и без знака, и вам не нужно беспокоиться о целочисленных диапазонах и рекламных акциях.

unsigned int x = 4000000000;
int y = -1;

int z = min(x, y);
z = (int)fmin(x, y);
0
ответ дан 24 November 2019 в 13:41
поделиться

Как указал Ричард Корден, используйте функции C ++ Min и Max, определенные в пространстве имен Std. Они обеспечивают безопасность типа и помогают избежать сравнения смешанных типов (I.e. Float Point vs Integer) то, что иногда может быть нежелательным.

Если вы обнаружите, что библиотека, которую вы используете C ++, определяют, определяет мин / макс, так как макросы, это может привести к конфликтам, то вы можете предотвратить нежелательные макрозамена, вызов функции min / Max таким образом (обратите внимание на дополнительные кронштейны):

(std::min)(x, y)
(std::max)(x, y)

запомнить , Это будет эффективно отключить , зависимый от аргументов (ADL, также называемый поиском Koenig), если вы хотите полагаться на ADL.

2
ответ дан 24 November 2019 в 13:41
поделиться