您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關C++如何使用仿函數,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
所謂仿函數就是和函數調用非常類似的一種調用方式,實際上仿函數只是重載了()運算符,
這種方式在STL容器函數中使用非常普遍,其中又分為函數對象和謂詞
class t
{
public:
void operator()(stu& a) 函數對象(一元)
/*
bool operator()(stu& a) 謂詞(一元),謂詞只會放回布爾值
*/
};
void test(stu& a) 函數
那么調用我們可以很清楚的可以看出
仿函數調用為
t lfun;
lfun(a);
其中lfun為定義的類對象而已
函數調用為
test(a);
他們的調用看起來及其相似。
下面演示仿函數的使用方式
點擊(此處)折疊或打開
/*************************************************************************
> File Name: 仿函數.cpp
> Author: gaopeng QQ:22389860 all right reserved
> Mail: gaopp_200217@163.com
> Created Time: Sun 23 Apr 2017 08:03:41 PM CST
************************************************************************/
#include<iostream>
#include<vector>
#include<algorithm>
#include<string.h>
using namespace std;
class testfun //仿函數
{
public:
testfun(void)
{
cnt = 0;
}
void operator()(int& a)
{
cnt++;
if( !(a%67))
{
cout<<a <<endl;
}
}
int cnt;
};
class stu
{
private:
char name[20];
int age;
friend class stufun;
public:
stu(const char* inc,int b)
{
strcpy(name,inc);
age = b;
}
};
class stufun
{
public:
int equ;
public:
stufun(int m):equ(m){} //構造函數,仿函數中可以存儲任何比較條件 這是仿函數(函數對象或者謂詞)和函數指針進行傳遞到STL函數的區別,因為仿函數更加方便
/*
void operator()(stu& a) //仿函數 一元函數對象 stufun(m)比較比m大的值 stu&a代表是STL函數會將每一個容器對象 stu 通過引用傳入到a中然后一一進行比較
{
if(a.age == equ)
{
cout<<a.name<<endl;
cout<<a.age<<endl;
}
}
*/
bool operator()(stu& a) //一元謂詞 stu&a代表是STL函數會將每一個容器對象 stu 通過引用傳入到a中然后一一進行比較
{
if(a.age == equ)
{
cout<<a.name<<endl;
cout<<a.age<<endl;
return true;
}
else
{
return false;
}
}
};
void kkfun(int& a)
{
if( !(a%67))
{
cout<<a <<endl;
}
}
int main(void)
{
cout<<"test1----"<<endl;
vector<int> m;
for(int i = 0;i<999;i++)
{
m.push_back(i);
}
testfun l;
l = for_each(m.begin(),m.end(),testfun());//調用仿函數 匿名函數對象 進行拷貝需要接回來
for_each(m.begin(),m.end(),kkfun);//調用函數指針
cout<<"test2----"<<endl;
vector<stu> ii;
stu a("gaopeng",31);
stu b("yanllei",30);
stu c("gzh",3);
stu d("test",31);
ii.push_back(a);
ii.push_back(b);
ii.push_back(c);
ii.push_back(d);
//for_each(ii.begin(),ii.end(),stufun());
stufun o(3);
for_each(ii.begin(),ii.end(),o);//調用謂詞 定義的函數對象o
// stufun o;
// o(a);
return 0;
}
關于“C++如何使用仿函數”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。