函式介面卡

2021-07-29 05:54:37 字數 1904 閱讀 9998

先弄清幾個概念,什麼叫一元函式,二元函式

1. 一元函式乙個引數

2. 二元函式 兩個引數

3. 一元謂詞 乙個引數,返回型別為bool型

4. 二元謂詞 兩個引數,返回型別為bool型

函式介面卡是用來讓乙個函式物件表現出另外一種型別的函式物件的特徵。因為,許多情況下,我們所持有的函式物件或普通函式的引數個數或是返回值型別並不是我們想要的,這時候就需要函式介面卡來為我們的函式進行適配

c++中有三類介面卡,分別是容器介面卡,迭代器介面卡和函式介面卡,這裡主要介紹函式介面卡。

函式介面卡用於特化和擴充套件一元二元函式物件,函式介面卡主要有以下兩類:

1 繫結器

該類介面卡用於將二元函式適配成一元函式

將二元函式的乙個引數繫結到乙個特定的值上,將二元函式物件轉換成一元函式物件。

繫結器介面卡有兩種:bind1st bind2nd。每個繫結器接受乙個函式物件和乙個值

bind1st將給定值繫結到二元函式物件的第乙個實參

bind2nd將給定值繫結到二元函式物件的第二個實參

例子:先看下count_if的普通用法

count_if:  利用輸入的函式,對標誌範圍內的元素進行比較操作,返回結果為true的個數。例如:vecint是用vector宣告的容器,已包含1,3,5,7,9元素,現要求求出大於等於3的元素個數

bool greaterthree(int inum)

else

}int icount = count_if(vecinta.begin(),vecinta.end(), greaterthree);

//這裡要求greaterthree的函式引數必須是乙個

//此時icount == 4

count_if(vec.begin(), vec.end(), bind2nd(less_equal(), 10));

// less_equal()函式是兩個引數,怎樣讓他變成乙個引數呢?

less_equal是stl為我們提供的乙個函式物件,它有兩個引數,其作用是比較第乙個引數值是否<=第二個引數值。但是count_if要求我們第三個引數必須是乙個一元謂詞(就是只有乙個引數),所以我們用bind2nd對該函式物件進行適配,將10繫結到該函式物件的第二個引數上。

(意思就是說less_equal( _left, _right)這個函式只要他的第二個引數,第乙個引數忽略)

現在cont_if執行的功能實際上就變成了查詢給定序列中值<=10的元素的個數

標準庫提供了一組函式介面卡(function adapter),用於特化和擴充套件一元和二元函式物件。函式介面卡分為如下兩類:

(1)繫結器(binder),是一種函式介面卡,它通過將乙個運算元繫結到給定值而將二元函式物件轉換為一元函式物件。

(2)求反器(negator),是一種函式介面卡,它將謂詞函式物件的真值求反。

標準庫定義了兩個繫結器介面卡:bind1st和bind2nd。每個繫結器接受乙個函式物件和乙個值。正如你可能想到的,bind1st將給定值繫結到二元函式物件的第乙個實參,bind2nd將給定值繫結到二元函式物件的第二個實參。例如,為了計算乙個容器中所有小於或等於10的元素的個數,可以這樣給count_if傳遞值:

count_if(vec.begin(),vec.end(),

bind2nd(less_equal(),10));

傳給count_if的第三個實參使用bind2nd函式介面卡,該介面卡返回乙個函式物件,該物件用10做右運算元應用<=操作符。這個呼叫計算輸入範圍中小於或等於10的元素的個數。

標準庫還定義了兩個求反器:not1和not2。你可能已經想到,not1將一元函式物件的真值求反,not2將二元函式物件的真值求反。

count_if(vec.begin(),vec.end(),not1(bind2nd(less_equal(),10)));

STL介面卡 函式介面卡

有時候需要對內建函式物件返回值進行進一步的簡單計算,或者填上多餘的引數,不能直接代入演算法。函式介面卡實現了這一功能,函式介面卡是將一種函式物件轉化為另一種符合要求的函式物件。函式介面卡可以分為4個大類 繫結介面卡 組合介面卡 指標函式介面卡和成員函式介面卡。需求 在遍歷容器的時候,將容器中的值全部...

函式介面卡

介面卡模式是一種常用的設計模式,介面卡將乙個類的介面轉換成客戶希望的另外乙個介面。介面卡模式使得原本由於介面不相容而不能一起工作的那些類可以在一起工作。簡單來說介面卡模式就是設計乙個介面卡,例項化乙個實現具體功能的類物件作為自己的成員。然後介面卡提供一些方法,這些方法實際上都將轉化成對這個成員的方法...

函式介面卡

什麼是函式介面卡?例如 templatebool toobig const t val,t lim 這是比較大小的模板函式,但是一次必須得接受兩個引數,但通常在 函式中,迭代器只有乙個,需要一種能將 多引數函式 轉換為 接收乙個引數的函式物件 的機制,這就叫做 函式介面卡 利用它進行改進,新增類 t...