1.函數對象
-
函數對象(仿函數):
重載函數調用操作的類,其對象常稱之為函數對象;
函數對象使用重載()時,其行為類似函數調用,也叫仿函數; - 函數對象本質:
函數對象(仿函數)本質是一個類,不是一個函數。
- 函數對象特點:
函數對象在使用時可以有形參、有返回值。
函數對象可以有自己的狀態值。
函數對象可以作為函數形參。
使用示例:
#include
using namespace std;
class myfunc
{
public:
myfunc()
{
count = 0;
}
//求和示例,重載()
int operator()(int a, int b)
{
return a + b;
}
//輸出示例,count記錄函數調用次數
void operator()(string str)
{
count++;
cout < str < endl;
}
int count;
};
void print(myfunc& p, string test)
{
p(test);
}
void test()
{
//創建一個函數對象
myfunc p1;
cout < "t函數對象形參返回使用示例:" < endl;
int ret=p1(10, 20);
cout < "ret=" < ret < endl;
cout < "t仿函數重載示例:" < endl;
p1("C++學習--仿函數使用示例!");
p1("C++學習--仿函數使用示例!");
p1("C++學習--仿函數使用示例!");
cout < "函數調用次數:" < p1.count < endl;
cout < "t仿函數作為函數形參:" < endl;
print(p1, "hello,歡迎學習c++課程");
}
int main()
{
test();
system("pause");
}

2.謂詞
-
謂詞:
函數對象返回值為bool類型,則稱之為謂詞; -
一元謂詞:
仿函數的形參只有一個; -
二元謂詞:
仿函數的形參有兩個參數;
#include
#include
#include
using namespace std;
class Check
{
public:
bool operator()(int val)
{
return val > 5;
}
bool operator()(int a1,int a2)
{
return a1 > a2;
}
};
void test()
{
vectorvtr;
/*插入數據*/
for (int i = 0; i < 10; i++)
{
vtr.push_back(i);
}
cout < "一元謂詞示例:查找vector容器中?>5的值" < endl;
/*查找vector容器中?>5的值*/
vector::iterator ret=find_if(vtr.begin(), vtr.end(), Check());//Check() ---匿名函數對象
if (ret ==vtr.end())
{
cout < "未查到到?>5的值!" < endl;
}
else
{
cout < "查找成功,大于5的值為:" <*ret

3.內建函數對象
-
內建函數對象:
STL中提供了一些內建函數對象:算術仿函數、關系仿函數、邏輯仿函數 --頭文件
3.1算術運算符
- 算術仿函數:實現四則運算。
加法:template T plus
減法:template T minus
乘法:template T mutiplies
除法:template T divides
取模:template T modulus
取反:template T negate --正數變負數,負數變正數
注意:其中negate是一元運算(只有一個參數),其余均為二元運算。
#include
using namespace std;
#include
void test()
{
//negate使用示例:
negate n;
cout < "negate取反示例:" < n(188) < endl;
plus p;
cout < "plus加法:" < p(10, 20) < endl;
minusm;
cout < "minus減法取絕對值:" < n(m(10, 20)) < endl;
multipliesmt;
cout < "multiplies乘法:" < mt(5, 3.15) < endl;
dividesd;
cout < "divides除法:" < d(10, 3) < endl;
modulusmd;
cout < "modulus取模:" < md(10, 3) < endl;
}
int main()
{
test();
system("pause");
}
3.2關系運算符
- 內建仿函數:關系運算符
大于: templatebool greater
大于等于:templatebool greater_equal
小于: templatebool less
小于等于:templatebool less_equal
等于: templatebool equal_to
不等于: templatebool not_equal_to
#include
using namespace std;
#include
#include
#include
void print(int val)
{
cout < val < " ";
}
int main()
{
vector vtr;
vtr.push_back(10);
vtr.push_back(40);
vtr.push_back(30);
vtr.push_back(60);
vtr.push_back(6);
/*sort排序,默認是從小到大,其默認的仿函數即less*/
sort(vtr.begin(), vtr.end());
for_each(vtr.begin(), vtr.end(), print);
cout < endl;
/*
要實現從大小,可以自行實現一個仿函數
class mycompare
{
public:
bool operator()(int a1,int a2)
{
return a1?>a2;
}
}
也可以直接使用STL內建仿函數:greater()
*/
sort(vtr.begin(), vtr.end(), greater());
for_each(vtr.begin(), vtr.end(), print);
cout < endl;
system("pause");
}

3.3邏輯運算符
- 內建仿函數--邏輯運算符
邏輯與:templatebool logical_and
邏輯或: templatebool logical_or
邏輯非: templatebool logical_not
#include
using namespace std;
#include
#include
#include
void print(bool val)
{
cout < val < " ";
}
void test()
{
vector vtr;
vtr.push_back(true);
vtr.push_back(true);
vtr.push_back(false);
vtr.push_back(false);
vectorvtr2;
vtr2.resize(vtr.size());//設置vtr2的容器大小
//將vtr容器內容取非放到vtr2中
transform(vtr.begin(), vtr.end(), vtr2.begin(), logical_not());
for_each(vtr.begin(), vtr.end(), print);
cout < endl;
for_each(vtr2.begin(), vtr2.end(), print);
cout < endl;
}
int main()
{
test();
system("pause");
}

審核編輯:湯梓紅
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
函數
+關注
關注
3文章
4417瀏覽量
67521 -
C++
+關注
關注
22文章
2124瀏覽量
77125
發布評論請先 登錄
相關推薦
熱點推薦
【乾芯QXS320F開發板試用】TMUFPU內建函數
到現在,一層套一層,我又在QX-IDE使用手冊里找到了內建函數描述表,這里面就是FPU和TMU使用的C函數
要使用內建函數,必須引用下圖頭文件 qx320f.h
打開這個頭文件,里面都
發表于 12-11 13:32
GCC內建函數問題!!!
目前的代碼中使用了GCC的內建函數__builtin_clz()和__builtin_popcount(),在CCS中編譯不能通過,請問,CCS是否有庫支持這兩個函數,多謝!
發表于 06-21 18:30
C++課程資料詳細資料合集包括了:面向對象程序設計與C++,算法,函數等
本文檔的主要內容詳細介紹的是C++課程資料資料合集包括了:面向對象程序設計與C++,算法,函數,概述, C++語言基礎,構造數據類型,數據類
發表于 07-09 08:00
?18次下載
如何在中斷C函數中調用C++
之前,我們在單片機程序開發時都會面對中斷函數。眾所周知的,這個中斷函數肯定是要用C函數來定義的。我在用C++進行程序開發的時候就發現了一個需
發表于 05-09 18:17
?0次下載
C++基礎語法之inline 內聯函數
上節我們分析了C++基礎語法的const,static以及 this 指針,那么這節內容我們來看一下 inline 內聯函數吧! inline 內聯函數 特征 相當于把內聯函數里面的內
如何在MPLAB XC16編譯器內建函數
MPLAB XC16編譯器提供了一系列內建函數,使C語言編程人員可以訪問目前只能通過行內匯編訪問的匯編運算符或機器指令。內建函數名都有一個前綴__builtin_,源代碼用C語言編寫,
虛函數,C++開發者如何有效利用
虛函數是基類中聲明的成員函數,且使用者期望在派生類中將其重新定義。那么,在 C++ 中,什么是虛函數呢?在 C++ 中,通常將虛
淺析C++執行構造函數編程實例
C++保證在你調用delete時,先自動調用析構函數(而我們安排在這個函數里面刪除它的法杖、法袍等對象),再刪除對象占用的內存。
發表于 03-03 15:44
?675次閱讀
C++基礎知識之函數1
函數是 C++ 中的一個重要概念,它可以讓我們將一段代碼封裝起來,然后在需要的時候調用它。C++ 中的函數有以下幾個特點:
* 函數可
C++基礎知識之函數2
在C++中,我們可以使用inline關鍵字來定義內聯函數。內聯函數是一種特殊的函數,它在編譯時會被直接嵌入到調用它的代碼中,從而避免了函數調
c++之函數對象與內建函數
評論