C++函數對象是通過一張虛函數表來實現的。簡稱為V-Table。在這個表中,主是要一個類的虛函數的地址表,這張表解決了繼承、重載的問題,保證其容真實反應實際的函數。
適合對屬於基本數據類型的對象排序,它使用<作為排序比較規則,第2種語法則是根據指定排序規則comp來進行排序,其中comp參數就是一個函數對象。如果要排序的對象不是如int,float等簡單類型或不想使用<作為排序規則的話就得使用第2種語法。
指定一個函數對象來作為排序規則函數對象)進行排序,那函數對象究竟是什麼了,其實簡單地說它就是一些使用起來像調用函數一樣的對象,如:一般的函數,函數指針,或重載了()運算符的類的實例等,使用這些對象的方式好像調用函數一樣所以稱這些對象為C++函數對象,如下就是函數對象定義:
- void print(int x)
- {
- if(x>=0&&x<=100) cout<<x<<” ”;
- }
- //函數對象指針
- typedef void(*ptPrint)(int x);
- ptPrint prt=print;
- //一個重載了()運算符得類
- class isOk
- {
- public:
- bool operator () (int val)
- {
- if(val<0||val>100)
- {
- return false;
- }
- return true;
- }
- };
有了上面得定義後,我們就可以以函數調用的形式使用上面的函數對象了,如: for_each(vectorA.begin(),vectorA.end(),print)打印大於等於0小於等於100的數, transform(vectorA.begin(),vectorA.end(),vectorB.begin(),isOk())判斷向量vectorA中值x的范圍是否在0之100之間。
如果在則向量vectorB對應的值為真,否則為假,其中vectorB中的數據類型為bool。在實際中往往會根據調用函數對象時參數的多少將函數對象分為三種形式,,無參函數對象,一元函數對象和二元函數對象,剛才的C++函數對象就是一個無參函數對象。無參函數對象與一元,二元函數對象有很大的區別,一元,二元函數對象的定義需要繼承以下函數原型:
- class Grade
- {
- public:
- Grade(int id,string name,int score)
- {
- ID=id;
- Name=name;
- Score=score;
- }
- int ID;
- string Name;
- int Score;
- };