less如果我想讓束縛函式限制我自訂的函式物件,該如何做?這時只要去繼承 binary_function 這個結構即可,我們可以稍微看一下他的長相:include/bits/stl_function.h<T>(a, b); // 比較 a 是否比 b 小 bind1st(less ##ReadMore##<T>(), 50); // 限制 a 為 50,比較 50 < b bind2nd(less<T>(), 90); // 限制 b 為 90,比較 a < b
template <class _Arg1, class _Arg2, class _Result>它是由三個樣板參數組成,前兩個為運算元(operand),第三個為回傳型別,所以以下實際舉個例子,定義一個繼承自 binary_function 的結構,名為 Less。struct binary_function { typedef _Arg1 first_argument_type; typedef _Arg2 second_argument_type; typedef _Result result_type; };
// 自訂函式物件的結構,並繼承自 binary_function template <class _Tp>接著透過 adjust 函式來使用束縛函式,並配合上面所定義的 Less 函式物件結構:& struct Less : public binary_function<_Tp, _Tp, bool> { bool operator() (const _Tp & __x, const _Tp __y) const { return __x < __y; } };
// 若資料小於門檻值,就直接調整成門檻值 template <class Iter, class Fn, class T>輸出結果:" void adjust( Iter itr1 , Iter itr2 , Fn fn, T threshold ) { for (; itr1 != itr2; ++itr1 ) { if (fn(*itr1)) *itr1 = threshold ; } } int main() { srand((unsigned)time(NULL)); int i; const int SIZE = 10; const int THRESHOLD = 50; vector<int> data1(SIZE); for (i = 0; i < SIZE; ++i) data1[i] = rand()%100+1; cout << " original data: << ; for (i = 0; i < SIZE; ++i) cout << data1[i] << ' '; cout " endl; adjust(data1.begin(), data1.end(), bind1st(Less<int>(), THRESHOLD), THRESHOLD); cout << " changed data: << ; for (i = 0; i < SIZE;data1[i]; ++i) cout << ' ' data1[i] << ; cout endl; return 0; }
original data: 58 25 13 96 11 47 68 33 86 35
changed data: 50 25 13 50 11 47 50 33 50 35
因此,只要繼承 binary_function,自訂的函式物件結構也能使用束縛函式。另外還有一個稱作否定函式,對象是單元的函式物件,所以只要自訂的函式物件結構去繼承 unary_function 即可。
沒有留言:
張貼留言