我有兩個包含x,y vales(y = f(x))的數組。我想提供一個函數來查找對應於y的最小或最大采樣值的x的值。在循環之前選擇較少或較大運算符的最佳方法
在循環數組中的值之前,選擇適當的比較運算符的有效方法是什麼?
例如,我想這樣做如下:
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
*我寧願避免使用模板化函數,如果可能的話。 –