2023年08月15日 09:10:04
1519人閱讀收藏
舉報c++深入學習(151)
先弄清幾個概念,什麼叫一元函式,二元函式
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的元素個數
[cpp]view plain
copy
bool
greaterthree(
intinum)
else
} inticount = 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的元素的個數
2 取反器將函式物件的結果真值求反
取反器有兩種:not1和not2
not1是對一元函式物件求反的取反器,傳遞給函式物件的只有乙個引數,則要使用這個not1
not2是對二元函式物件求反的取反器
例子int* where=find_if(&array[0],&array[100],not1(bind2nd(breater(),200)))
推薦乙個很好的判斷傳參的方法:先寫乙個類,過載()算符,並接受傳遞進來的引數,判斷後再返回真假
例子:[cpp]view plain
copy
#include
#include
#include
#include
#include
#define assert assert
using
namespace
std;
class
rand:
public
binary_function<
int,
int,
int>
intoperator()(
intminval,
intmaxval)
const
};
intmain()
STL介面卡 函式介面卡
有時候需要對內建函式物件返回值進行進一步的簡單計算,或者填上多餘的引數,不能直接代入演算法。函式介面卡實現了這一功能,函式介面卡是將一種函式物件轉化為另一種符合要求的函式物件。函式介面卡可以分為4個大類 繫結介面卡 組合介面卡 指標函式介面卡和成員函式介面卡。需求 在遍歷容器的時候,將容器中的值全部...
C 函式介面卡
1 考慮下面的需求,在乙個int的vector中,找出乙個比5的元素,容易想到的解決辦法,定義乙個方法物件,使用模板,如下 vector iterator iter find if intvec.begin intvec.end finder 3 2 分析 find if的偽 如下 for firs...
C函式介面卡
普通變數可以通過指標進行訪問,用起來很方便,現在我有個想法,就是玩函式也要玩的這麼炫,我想給它寫個介面卡 這裡我主要是用可變引數和函式指標來實現,有兩個測試 片段 test1 和test2 其中test1用的是可變引數的函式指標,test2用的是巨集實現的函式介面卡。如下 1 2 file adap...