STL 函式物件

2021-06-12 02:31:36 字數 2567 閱讀 4010

一 函式物件(functor)

stl中提供了一元和二元函式的兩種functor,通過unary_function和binary_function提供了這兩種不同引數數量的functor的基本結構,在這兩個型別中,分別內嵌定義一元和二元函式操作在模版推演的時候需要用到的typedef.

//一元函式的定義為

template

struct unary_function ;

//二元函式的定義為

template

struct binary_function ;

其他的一元和二元functor可以從這兩個基本結構繼承,同時也就可以推演出函式的引數和返回值的型別,stl在上述這兩個結構的基礎上,實現了很多一元和二元的functor.

//一元

negate

//二元

plus

minus

multiplies

divides

modulus

equal_to

not_equal_to

greater

greater_equal

less

less_equal

logical_and

logical_or

logical_not

上面的這些functor都是基於模版實現的,可以象下面那樣使用的方式:

plusint_plus;

cout << int_plus(111,222) << endl;

二 函式物件介面卡

函式物件介面卡的作用就是使函式轉化為函式物件,或是將多引數的函式物件轉化為少引數的函式物件。

1)bind

bind1st //通過繫結第乙個引數,使二元的函式物件轉化為一元的函式物件

bind2nd //通過繫結第二個引數,使二元的函式物件轉化為一元的函式物件

not1 //對一元的函式物件取反

not2 //對二元的函式物件取反

使用的方式:

bind1st( less(), 10)(20);

not2( lesslv;

for(i = 0; i < 100; i++)

//對vector中小於20的數進行記數

cout << count_if(lv.begin(), lv.end(), bind2nd(less(), 20)) << endl;

//由大到小排序

sort(lv.begin(), lv.end(), not2(less()) ) ;

for (i = 0; i < 100; i++)

2)ptr_fun

ptr_fun的作用是把現有的函式轉換為函式物件.在stl中提供了這個功能的functor,就是pointer_to_unary_function和pointer_to_binary_function這兩個類,這兩個類對應一元

和二元兩種函式,也就是說,對於呼叫引數為3個或者多於3個的函式,stl提供的functor類,無法配接.

基本使用方法:

int u_func(int a)

int b_func(int a,int b)

void call()

可以看到,上面的方法改進了原先c和c++中通過函式指標來間接呼叫函式的方法,將函式指標封裝到了類中.

問題:第一部分中的functor中是自己定義操作符(),但是在ptr_fun中,是將已經有的function轉為functor呼叫就會存在乙個呼叫方式的問題.

c++中的函式,按呼叫方式可以分為__cdecl, __stdcall,__fastcall 三種,ptr_fun如何正確的識別給定的function的呼叫方式就會有問題.

其中:vc6中的stl的ptr_fun**中,統一將function認為是__cdecl呼叫方式. 而dev-cpp中使用的sgi的**中沒有明確指明函式的呼叫方式,所以將使用編譯器的確省設定.

但是如果將上面的b_func函式改為

int __stdcall b_func(int a,int b)

上面的使用**在dev-cpp中無法編譯通過.

3)mem_fun

mem_fun是將某個類中的成員函式轉變為functor的功能.

一般的使用方法

struct mem_fun_struct

int u_mem_fun(int a)

int b_mem_fun(int a,int b)

};void call()

上面的**在dev-cpp 4.9.9中編譯通過,sgi stl中沒有提供二元成員函式的mem_fun,vc6中提供了mem_fun(無引數成員函式)和mem_fun1(一元引數成員函式), 而在vs2003中改變了用法.但是我看msdn好像也只支援到乙個引數.

三 總結

stl中提供了基本的一元和二元引數的functor, 同時提供了相應的介面卡可以對functor進行修飾,functor可以很好的和 stl容器,stl演算法結合使用.

但是仍有問題:

1)上面說到的呼叫方式

2) 多引數函式物件適配

對於我們比較複雜的stl不能滿足要求的問題,我們可以是用boost或loki來解決。

四 參考

STL 函式物件

4.1函式物件 4.1.1函式物件概念 過載函式呼叫操作符的類,其物件常稱為函式物件 函式物件使用過載的 時,行為類似函式呼叫,也叫仿函式 本質 函式物件 仿函式 是乙個類,不是函式 函式物件使用 特點 函式物件在使用時,可以像普通函式那樣呼叫,可以有引數,可以有返回值 函式物件超出普通函式概念,函...

stl 仿函式 函式物件

定義 stl原始碼剖析 仿函式其實上就是乙個 行為類似函式 的物件。即主體是物件,只是使用起來像乙個函式。傳遞函式指標 templatebool compare to const t x,const t y templatevoid print compare t fun int main 傳遞的是...

STL 仿函式(函式物件)

定義 一種具有函式特徵的物件,呼叫者可以像函式一樣使用該物件,為了能夠 行為類似函式 該物件所在類必須自定義函式呼叫運算子operator 就可以在仿函式物件後面加上一對小括號,以此呼叫仿函式定義的operator 操作。class mul2 class mul3 intmain for each ...