STL-函数对象
- 函数对象概念
- 重载函数调用操作符的类,其对象常称为函数对象
- 函数对象使用重载的()时,行为类似函数调用,也叫仿函数
- 本质
- 函数对象(仿函数)是一个类,不是一个函数—修改算法策略—采用虚拟对象调用
- 函数对象的使用
- 理解
- 仿函数其实就是理解为取出当前容器中的数据,而后在重载()()中进行相关的运算输出,输出的是何种值就是该重载函数的返回值类型
- 特点
- 函数对象在使用时,可以像普通函数那样调用,可以有参数,可以有返回值—通过类构造对象后实现函数
- 函数对象超出普通函数的概念,函数对象可以有自己的状态—可以有自己的属性,因为自身就是一个类
- 函数对象可以作为参数传递
- 谓词
- 概念
- 返回bool类型的仿函数称为谓词
- 如果operator()接受一个参数,那么叫做一元谓词
- 如果operator()接受两个参数,那么叫做二元谓词
- 概念
- 内建函数对象—已经存在的仿函数
- 概念
- STL内建了一些函数对象
- 分类
- 算术仿函数
- 关系仿函数
- 逻辑仿函数
- 用法
- 这些仿函数所产生的对象,用法和一般函数完全相同
- 使用内建函数对象,需要引入头文件#include< functional >
- 概念
- 算术仿函数
- 功能
- 实现四则运算
- 其中negate是一元运算,其他都是二元运算
- 功能
- 四则运算仿函数原型
- template< class T > T plus< T >—加法仿函数
- template< class T > T minus< 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 >—取反仿函数
void test(void){ negate<int>n; cout << n(50) << endl; plus<int>p; cout << p(10, 20) << endl; }
- 关系运算仿函数
- template< class T > bool equal_to< T >—等于
- template< class T > bool no_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 >—小于等于
void test(void){ vector<int> v; v.push_back(10); v.push_back(30); v.push_back(20); sort(v.begin(), v.end(), greater<int>()); //等价于sort(v.begin(), v.end(), mycompare()); }
- 逻辑关系仿函数
- template< class T > bool logical_and< T >—逻辑与
- template< class T > bool logical_or< T >—逻辑或
- template< class T > bool logical_not< T >—逻辑非
void test(void){ vector<int> v; v.push_back(true); v.push_back(false); v.push_back(true); //利用逻辑非将容器v搬运到容器v2中 vector<int> v2; v2.resize(v.size());//要开辟好 transform(v.begin(), v.end(), v2.begin(), logical_not<bool>); }