У меня есть два массива, содержащие x, y vales для y = f (x). Я хотел бы предоставить функцию, которая найдет значение x, соответствующее либо минимальному, либо максимальному выборочному значению y.Оптимальный способ выбора меньшего или большего оператора перед циклом
Что представляет собой эффективный способ выбора правильного оператора сравнения перед циклом над значениями в массивах?
Например, я хотел бы сделать что-то вроде следующего:
double FindExtremum(const double* x, const double* y,
const unsigned int n, const bool isMin) {
static std::less<double> lt;
static std::greater<double> gt;
std::binary_function<double,double,bool>& IsBeyond = isMin ? lt : gt;
double xm(*x), ym(*y);
for (unsigned int i=0; i<n; ++i, ++x, ++y) {
if (IsBeyond()(*y,ym)) {
ym = *y;
xm = *x;
}
}
}
К сожалению, базовый класс std::binary_function
не определяет виртуального оператора().
Будет ли компилятор, как g ++ 4.8, иметь возможность оптимизировать наиболее прямолинейную реализацию?
double FindExtremum(const double* x, const double* y,
const unsigned int n, const bool isMin) {
double xm(*x), ym(*y);
for (unsigned int i=0; i<n; ++i, ++x, ++y) {
if ((isMin && (*y<ym)) ||
(!isMin && (*y>ym))) {
ym = *y;
xm = *x;
}
}
}
Есть ли другой способ упорядочить работу, чтобы упростить компилятор для оптимизации? Есть ли известный алгоритм для этого?
Я бы предпочел не использовать шаблонную функцию, если это возможно.
Что такое 'min' в обоих ваших примерах? – 0x499602D2
@ 0x499602D2 - спасибо, изменил 'min' на' isMin' – Corey
* Я бы предпочел не использовать шаблонную функцию, если это возможно. * Почему? –