【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 阅读(161) 评论(0) 编辑 收藏 举报