1、 仿函数也叫作函数对象,是一种具有函数特质的对象,调用者可以像函数一样地调用这些对象。仿函数必须重载operator()。
2、 STL中仿函数代替函数指针的原因在于函数指针不能满足STL对抽象性的要求,也不能满足软件积木的要求,函数指针无法与STL其他组件搭配。
3、 STL仿函数与STL算法之间的关系:
4、 为了拥有配接能力,每一个仿函数必须定义自己的相应型别,仿函数的相应型别主要来表现函数参数型别和传回值型别。
5、 unary_function用来呈现一元函数的参数型别和返回值型别。
//STL规定,每一个Adaptable Unary Function都应继承此类别
template <class Arg, class Result>
struct unary_function {
typedef Arg argument_type;
typedef Result result_type;
};
6、binary_function用来呈现二元函数的第一参数型别、第二参数型别及返回值型别。
//STL规定,每一个Adaptable Binary Function都应继承此类别
template <class Arg1, class Arg2, class Result>
struct binary_function {
typedef Arg1 first_argument_type;
typedef Arg2 second_argument_type;
typedef Result result_type;
};
7、 STL内建算术类仿函数:加法:plus<T>,减法:minus<T>,乘法:multiplies<T>,除法:divides<T>,取模:modulus<T>,取反:negate<T>。
8、 STL内建关系类仿函数:等于:equal_to<T>,不等于:not_equal_to<T>,大于:greater<T>,大于等于:greater_equal<T>,小于:less<T>,小于等于:less_equal<T>。
9、 STL内建逻辑类仿函数:逻辑运算And:logical_and<T>,逻辑运算Or:logical_or<T>,逻辑运算Not:logical_not<T>。
10、 证同元素:运算op的证同元素是指数值A与该元素做op运算,会得到A自己。
11 、 具体例子:#include<functional>
#include<iostream>
using namespace std;
int main(){
//算术类仿函数
plus<int> plusobj;
minus<int> minusobj;
multiplies<int> mulobj;
divides<int> divobj;
modulus<int> modobj;
negate<int> negobj;
cout << plusobj(3, 5) << endl; //8
cout << minusobj(3, 5) << endl; //-2
cout << mulobj(3, 5) << endl; //15
cout << divobj(3, 5) << endl; //0
cout << modobj(3, 5) << endl; //3
cout << negobj(3) << endl; //-3
//用临时对象调用
cout << plus<int>()(3, 5) << endl; //8
cout << minus<int>()(3, 5) << endl;//-2
cout << multiplies<int>()(3, 5) << endl;//15
cout << divides<int>()(3, 5) << endl;//0
cout << modulus<int>()(3, 5) << endl;//3
cout << negate<int>()(3) << endl;//-3
//关系类仿函数
equal_to<int> equal_to_obj; //,不等于:,大于:greater<T>,大于等于:greater_equal<T>,小于:less<T>,小于等于:less_equal<T>。
not_equal_to<int> not_equal_to_obj;
greater<int> greater_obj;
greater_equal<int> greater_equal_obj;
less<int> less_obj;
less_equal<int> less_equal_obj;
cout << boolalpha << equal_to_obj(3, 5) << endl; //false
cout << not_equal_to_obj(3, 5) << endl;//true
cout << greater_obj(3, 5) << endl;//false
cout << greater_equal_obj(3, 5) << endl;//false
cout << less_obj(3, 5) << endl;//true
cout << less_equal_obj(3, 5) << endl;//true
//用临时对象调用
cout << boolalpha << equal_to<int>()(3, 5) << endl; //false
cout << not_equal_to<int>()(3, 5) << endl;//true
cout << greater<int>()(3, 5) << endl;//false
cout << greater_equal<int>()(3, 5) << endl;//false
cout << less<int>()(3, 5) << endl;//true
cout << less_equal<int>()(3, 5) << endl;//true
//逻辑类仿函数
logical_and<int> logical_and_obj;
logical_or<int> logical_or_obj;
logical_not<int> logical_not_obj;
cout << logical_and_obj(1, 0) << endl; //false
cout << logical_or_obj(1, 0) << endl;//true
cout << logical_not_obj(1) << endl;//false
//用临时对象调用
cout << logical_and<int>()(1, 0) << endl; //false
cout << logical_or<int>()(1, 0) << endl;//true
cout << logical_not<int>()(1) << endl;//false
system("pause");
return 0;
}