Я люблю способ, которым SubSonic делает один столбец только вещь.
Или
DataBaseTable.GetList(DataBaseTable.Columns.ColumnYouWant)
, или:
Query q = DataBaseTable.CreateQuery()
.WHERE(DataBaseTable.Columns.ColumnToFilterOn,value);
q.SelectList = DataBaseTable.Columns.ColumnYouWant;
q.Load();
, Но Linq все еще король когда дело доходит до ленивой загрузки.
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)Даже при использовании с поплавками шаблон может выиграть в производительности. Компилятор всегда имеет возможность встраивать вызовы шаблонных функций, поскольку исходный код является частью модуля компиляции. Иногда, с другой стороны, невозможно встроить вызов библиотечной функции (совместно используемые библиотеки, отсутствие оптимизации времени компоновки и т. Д.).
Компилятор всегда имеет возможность встраивать вызовы шаблонных функций, поскольку исходный код является частью модуля компиляции. С другой стороны, иногда невозможно встроить вызов библиотечной функции (совместно используемые библиотеки, отсутствие оптимизации времени компоновки и т. Д.). Компилятор всегда имеет возможность встраивать вызовы шаблонных функций, поскольку исходный код является частью модуля компиляции. Иногда, с другой стороны, невозможно встроить вызов библиотечной функции (совместно используемые библиотеки, отсутствие оптимизации времени компоновки и т. Д.).fmin и fmax предназначены только для переменных с плавающей запятой и double.
min и max являются шаблонными функциями, позволяющими сравнивать любые типы с учетом двоичного предиката. Их также можно использовать с другими алгоритмами для обеспечения сложной функциональности.
Я всегда использую макросы min и max для целых чисел. Я не уверен, зачем кому-то использовать fmin или fmax для целочисленных значений.
Большая проблема с min и max заключается в том, что они не являются функциями, даже если они похожи на них. Если вы сделаете что-то вроде:
min (10, BigExpensiveFunctionCall())
Этот вызов функции может вызываться дважды в зависимости от реализации макроса. Поэтому в моей организации лучше всего никогда не вызывать min или max с вещами, которые не являются литералами или переменными.
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 ++. .
Я бы предпочел функции C ++ min / max, если вы используете C ++, потому что они зависят от типа. fmin / fmax заставит все преобразовать в / из чисел с плавающей запятой.
Кроме того, функции C ++ min / max будут работать с определяемыми пользователем типами, если вы определили operator <для этих типов.
HTH
Используйте std :: min
и std :: max
.
Если другие версии быстрее, чем ваша реализация может добавить для них перегрузки, и вы получите преимущество в производительности и переносимости:
template <typename T>
T min (T, T) {
// ... default
}
inline float min (float f1, float f2) {
return fmin( f1, f2);
}
Как вы сами заметили, fmin
и fmax
были введены в C99. Стандартная библиотека C ++ не имеет функций fmin
и fmax
. Пока стандартная библиотека C99 не будет включена в C ++ (если вообще когда-либо), области применения этих функций четко разделены. Нет ситуации, когда вам, возможно, пришлось бы «предпочитать» одно другому.
Вы просто используете шаблонный std :: min
/ std :: max
в C ++ и используете все, что доступно на C.
Если ваша реализация предоставляет 64-битный целочисленный тип, вы можете получить другой (неправильный) ответ, используя fmin или fmax. Ваши 64-битные целые числа будут преобразованы в двойные, которые (по крайней мере, обычно) будут иметь значение меньше 64-битного. Когда вы конвертируете такое число в двойное, некоторые из наименее значимых битов могут / будут полностью потеряны.
Это означает, что два действительно разных числа могут оказаться равными при преобразовании в двойное - и результат будет это неправильное число, которое не обязательно равно какому-либо из исходных входных данных.
fmin
и fmax
, из fminl
и fmaxl
могут быть предпочтительнее при сравнении целых чисел со знаком и без знака - вы Вы можете воспользоваться тем фактом, что весь диапазон чисел со знаком и без знака, и вам не нужно беспокоиться о целочисленных диапазонах и рекламных акциях.
unsigned int x = 4000000000;
int y = -1;
int z = min(x, y);
z = (int)fmin(x, y);
Как указал Ричард Корден, используйте функции C ++ Min и Max, определенные в пространстве имен Std. Они обеспечивают безопасность типа и помогают избежать сравнения смешанных типов (I.e. Float Point vs Integer) то, что иногда может быть нежелательным.
Если вы обнаружите, что библиотека, которую вы используете C ++, определяют, определяет мин / макс, так как макросы, это может привести к конфликтам, то вы можете предотвратить нежелательные макрозамена, вызов функции min / Max таким образом (обратите внимание на дополнительные кронштейны):
(std::min)(x, y)
(std::max)(x, y)
запомнить , Это будет эффективно отключить , зависимый от аргументов (ADL, также называемый поиском Koenig), если вы хотите полагаться на ADL.