【STL源码剖析读书笔记】【第7章】仿函数

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;
}


posted on 2015-05-26 11:47  ruan875417  阅读(159)  评论(0编辑  收藏  举报

导航