/* 什麼是函式介面卡?
例如:
templatebool toobig(const t& val,t & lim)
這是比較大小的模板函式,但是一次必須得接受兩個引數,但通常在
函式中,迭代器只有乙個,需要一種能將 多引數函式 轉換為 「接收乙個引數的函式物件」
的機制,這就叫做「函式介面卡」。
利用它進行改進,新增類:
templateclass toobig2;
bool operator()(const t&val)
}於是用法變為:
toobig2tb100;
int x;
cin>>x;
if(tb100(x))
即 :呼叫tb100(x)相當於呼叫toobig(x,100) 。
優點就是:接受兩個引數的函式,被轉換為接受乙個引數的函式物件
簡而言之,toobig2就是乙個函式介面卡。
※ 在stl中 ,提供了 binder1st和 binder2nd 類,可以自動完成這一過程 ,他們將自適應二元函式
轉換為自適應一元函式。
例如: 有函式 f2( type val_1,type val_2 );它接受兩個引數
用法: binder1st(f2,val) f1; 成功轉化為了一元函式:f1將 val作為成員,將f2作為成員函式
於是 f1(x) 等價於 f2(val,x)
前提:僅當f2也是乙個自適應函式的時候,這才能實現。
※ stl又提供了bind1st,以簡化binder1st類的使用。
例子:將二元函式multiplies()轉化為將引數乘以2.5的一元函式,可以這樣做:
bind1st(multiplies(),2.5);
※ binder2nd類似於binder1st,只不是將常數賦給了第二個引數。它有乙個助手程式bind2nd,類似於bind1st */
#include#include#include#include#includevoid show(double);
const int lim=6;
int main(void);
double arr2[lim]=;
vectorgr8(arr1,arr1+lim);
vectorm8(arr2,arr2+lim);
cout.setf(ios_base::fixed);
cout.precision(1);
cout<<"gr8: \t";
for_each(gr8.begin(),gr8.end(),show);
cout sum
transform(gr8.begin(),gr8.end(),m8.begin(),sum.begin(),plus());
cout<<"sum:\t";
for_each(sum.begin(),sum.end(),show);
coutprod
transform(gr8.begin(),gr8.end(),prod.begin(),bind1st(multiplies(),2.5));
cout<<"prod:\t";
for_each(prod.begin(),prod.end(),show);
cout
void show(double v)
STL介面卡 函式介面卡
有時候需要對內建函式物件返回值進行進一步的簡單計算,或者填上多餘的引數,不能直接代入演算法。函式介面卡實現了這一功能,函式介面卡是將一種函式物件轉化為另一種符合要求的函式物件。函式介面卡可以分為4個大類 繫結介面卡 組合介面卡 指標函式介面卡和成員函式介面卡。需求 在遍歷容器的時候,將容器中的值全部...
函式介面卡
介面卡模式是一種常用的設計模式,介面卡將乙個類的介面轉換成客戶希望的另外乙個介面。介面卡模式使得原本由於介面不相容而不能一起工作的那些類可以在一起工作。簡單來說介面卡模式就是設計乙個介面卡,例項化乙個實現具體功能的類物件作為自己的成員。然後介面卡提供一些方法,這些方法實際上都將轉化成對這個成員的方法...
函式介面卡
先弄清幾個概念,什麼叫一元函式,二元函式 1.一元函式乙個引數 2.二元函式 兩個引數 3.一元謂詞 乙個引數,返回型別為bool型 4.二元謂詞 兩個引數,返回型別為bool型 函式介面卡是用來讓乙個函式物件表現出另外一種型別的函式物件的特徵。因為,許多情況下,我們所持有的函式物件或普通函式的引數...