函数对象(仿函数)
重载函数调用操作符的类,其对象称为函数对象(function object),即他们是行为类似函数的对象,也叫仿函数(functor),其实就是重载"()"操作符,使得类对象可以像函数那样被调用
注意:
函数对象(仿函数)是一个类,不是一个函数
假定某个类有一个重载的operator(),而且重载的operator()要求获取一个参数,就称其为“一元仿函数(unary functor)”;诸如此类,两个参数即称为二元仿函数等等
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct MyPrint {
MyPrint ( ) : num ( 0 ) { }
void operator ( ) ( int val) {
num++ ;
cout << val << endl;
}
int num;
} ;
void FunctorTest1 ( ) {
MyPrint print;
print ( 45 ) ;
}
int num = 0 ;
void MyPrint2 ( int val) {
num++ ;
cout << val << endl;
}
void FunctorTest2 ( ) {
MyPrint2 ( 45 ) ;
MyPrint2 ( 78 ) ;
cout << "MyPrint2()函数调用了:" << num << "次" << endl;
MyPrint print;
print ( 445 ) ;
print ( 99 ) ;
print ( 781 ) ;
cout << "MyPrint()函数调用了:" << print. num << "次" << endl;
}
void FunctorTest3 ( ) {
vector< int > v;
v. push_back ( 45 ) ;
v. push_back ( 78 ) ;
v. push_back ( 12 ) ;
v. push_back ( 233 ) ;
MyPrint print;
MyPrint print2 = for_each ( v. begin ( ) , v. end ( ) , print) ;
cout << "函数调用次数:" << print. num << endl;
cout << "函数调用次数:" << print2. num << endl;
}
int main ( ) {
FunctorTest3 ( ) ;
return 0 ;
}
谓词概念
谓词是指普通函数或重载的operator()返回值是bool类型的函数对象(仿函数)。如果operator接受一个参数,那么叫做一元谓词,以此类推
内建函数对象
STL 内建了一些函数对象。分为:算数类函数对象,关系运算类函数对象,逻辑运算类仿函数。这些仿函数所产生的对象,用法和一般函数完全相同,当然我们还可以产生无名的临时对象来履行函数功能。使用内建函数对象,需要引入头文件 #include。
6 个算数类函数对象,除了 negate 是一元运算,其他都是二元运算。
template < class T > T plus< T>
template < class T > T minute< T>
template < class T > T multiplies< T>
template < class T > T divides< T>
template < class T > T modulus< T>
template < class T > T negate< T>
6 个关系运算类函数对象,每一种都是二元运算。
template < class T > bool equal_to< T>
template < class T > bool not_equal_to< T>
template < class T > bool greater< T>
template < class T > bool greater_equal< T>
template < class T > bool less< T>
template < class T > bool less_equal< T>
逻辑运算类运算函数,not 为一元运算,其余为二元运算。
template < class T > bool logical_and< T>
template < class T > bool logical_or< T>
template < class T > bool logical_not< T>