STL 函式物件 謂詞 預定義函式物件 函式介面卡

2022-06-05 07:12:11 字數 4590 閱讀 8845

過載函式呼叫操作符的類,其物件常稱為函式物件(function object),即它們是行為類似函式的物件,也叫仿函式(functor),其實就是過載「()」操作符,使得類物件可以像函式那樣呼叫。

注意:函式物件(仿函式)是乙個類,不是乙個函式。

函式物件(仿函式)過載了」() 」操作符使得它可以像函式一樣呼叫。

分類:假定某個類有乙個過載的operator(),而且過載的operator()要求獲取乙個引數,我們就將這個類稱為「一元仿函式」(unary functor);相反,如果過載的operator()要求獲取兩個引數,就將這個類稱為「二元仿函式」(binary functor)。

函式物件的作用:

stl提供的演算法往往都有兩個版本,其中乙個版本表現出最常用的某種運算,另一版本則允許使用者通過template引數的形式來指定所要採取的策略。

「在標準庫中,函式物件被廣泛地使用以獲得彈性」,標準庫中的很多演算法都可以使用函式物件或者函式來作為自定的**行為。

#define _crt_secure_no_warnings

#include #include #include using namespace std;

struct myprint

void operator()(int val)

public:

int mnum;

};int num = 0; //真正開發中,盡量避免去使用全域性變數,加鎖解鎖繁瑣

void myprint02(int val)

void test01()

void test02()

int main(void)

/*結果:

1020

3040

print呼叫次數:0

print呼叫次數:4

*/

謂詞是指普通函式或過載的operator()返回值是bool型別的函式物件(仿函式)。如果operator接受乙個引數,那麼叫做一元謂詞,如果接受兩個引數,那麼叫做二元謂詞,謂詞可作為乙個判斷式。

//一元謂詞函式舉例如下

//1,判斷給出的string物件的長度是否小於6

bool gt6(const string &s)

//2,判斷給出的int是否在3到8之間

bool compare( int i )

//二元謂詞舉例如下

//1,比較兩個string物件,返回乙個bool值,指出第乙個string是否比第二個短

bool isshorter(const string &s1, const string &s2)

1)預定義函式物件基本概念:

標準模板庫stl提前定義了很多預定義函式物件,#include 必須包含。

//使用預定義函式物件:

//類模板plus<> 的實現了: 不同型別的資料進行加法運算

void main41()

}

2)算術函式物件

預定義的函式物件支援加、減、乘、除、求餘和取反。呼叫的操作符是與type相關聯的例項

加法:plus

plusstringadd;

sres = stringadd(sva1,sva2);

減法:minus

乘法:multiplies

除法divides

求餘:modulus

取反:negate

negateintnegate;

ires = intnegate(ires);

ires= unaryfunc(negate(),ival1);

3)關係函式物件

等於equal_to

equal_tostringequal;

sres = stringequal(sval1,sval2);

不等於not_equal_to

大於 greater

大於等於greater_equal

小於 less

小於等於less_equal

void main42()

4)邏輯函式物件

邏輯與 logical_and

logical_andindand;

ires = intand(ival1,ival2);

dres=binaryfunc( logical_and(),dval1,dval2);

邏輯或logical_or

邏輯非logical_not

logical_notintnot;

ires = intnot(ival1);

dres=unaryfunc( logical_not,dval1);

標準庫提供一組函式介面卡,用來特殊化或者擴充套件一元和二元函式物件。常用介面卡是:

常用函式介面卡列表如下:

繫結器(binder)

struct myprint : public binary_function

};void test01()

int addnum = 200;

cout << "bind1st結果:" << endl;

for_each(v.begin(), v.end(), bind1st(myprint(), addnum));//繫結介面卡 將乙個二元函式物件轉變成一元函式物件

cout << "bind2nd結果:" << endl;

for_each(v.begin(), v.end(), bind2nd(myprint(), addnum));

//bind1st bind2nd區別?

//bind1st,將addnum繫結為函式物件的第乙個引數

//bind2nd,將addnum繫結為函式物件的第二個引數}/*

bind1st結果:

v:200 val:0 v+val:200

v:200 val:1 v+val:201

v:200 val:2 v+val:202

bind2nd結果:

v:0 val:200 v+val:200

v:1 val:200 v+val:201

v:2 val:200 v+val:202

*/

取反器(negator)
struct myprint02 

};struct mycompare : public binary_function

};struct mygreater5 : public binary_function

};//仿函式介面卡 not1 not2 取反介面卡

void test02()

for_each(v.begin(), v.end(), myprint02());

cout << endl;

sort(v.begin(), v.end(), mycompare());

for_each(v.begin(), v.end(), myprint02());

cout << endl;

sort(v.begin(), v.end(), not2(mycompare()));

for_each(v.begin(), v.end(), myprint02());

cout << endl;

//not1 not2

//如果對二元謂詞取反,用not2

//如果對一元謂詞取反,用not1

vector::iterator it = find_if(v.begin(), v.end(), not1(bind2nd(mygreater5(), 10)));

if (it == v.end())

else

}

ptr_fun(op)
void myprint03(int val, int val2) 

//ptr_func把普通函式轉成函式物件

for_each(v.begin(), v.end(), bind2nd(ptr_fun(myprint03), 10));}/*

結果:val1:0 val2:10 val + val2:10

val1:1 val2:10 val + val2:11

val1:2 val2:10 val + val2:12

val1:3 val2:10 val + val2:13

val1:4 val2:10 val + val2:14

*/

成員函式介面卡:

mem_fun_ref、mem_fun

class person 

void show()

public:

int age;

int id;

};void test04()

/*結果:

age:10 id:20 aaa

age:30 id:40 aaa

age:50 id:60 aaa

age:10 id:20 aaa

age:30 id:40 aaa

age:50 id:60 aaa

*/

函式物件,一元謂詞,二元謂詞,預定義函式物件

find if sort for each 的使用 for each v1.begin v1.end showelemt 要使用預定義函式物件需要包含 functional 標頭檔案vector iterator it find if v1.begin v1.end myint sort v3.be...

STL中的預定義函式物件和函式介面卡

預定義函式物件 stl模板庫中封裝的函式 函式介面卡 對於stl中的有些演算法,其輸入引數有些限制 比如引數個數等 因此需要用到函式介面卡將引數適配成適合演算法的輸入,這個是我個人的理解。1 預定義函式物件基本概念 標準模板庫stl提前定義了很多預定義函式物件,include 必須包含。1使用預定義...

STL函式物件之自定義函式物件

如何定義自己的函式物件,它使用於任何的繫結器 要定義自己的繫結器要滿足一定的條件 必須提供引數和返回值的型別。stl為我們提供了兩個結構體 template struct unary function template struct binary function 乙個例子 template str...