1.函数对象
1.1 基本概念
重载了函数调用操作符的类,其对象称为函数对象,函数对象的函数也叫做仿函数。
函数对象的本质是一个类,并不是一个函数。
1.2 使用
- 函数对象在使用时,和普通函数一样,可以有参数,可以有返回值
- 函数对象可以作为参数传递
- 函数对象超出普通函数的概念,函数对象可以有自己的状态
2.谓词
基本概念:
- 返回bool类型的仿函数称为谓词
- 如果传入参数为一个,则称其为一元谓词
- 如果传入参数为两个,则称其为二元谓词
3.内建函数对象
3.1 概念
在STL中已经定义好的的一些函数对象。
使用时,引入头文件 #include <functional>
内建函数对象的分类:
-
算术仿函数:实现四则运算
- 加-plus
- 减-minus
- 乘-multiplies
- 除-divides
- 取模-modulus
- 取反-negete(一元运算)
算术运算符例:
#include <functional> using namespace std; void test1() { negate<int> neg; // 取反运算,一元运算 cout << neg(50) << endl; } // 输出结果:-50 void test2() { plus<int> p; // 加法运算,二元运算 cout << p(50, 50) << endl; } // 输出结果:100
-
关系仿函数:实现关系运算
- 等于-equal_to
- 不等于-not_equal_to
- 大于-greater
- 大于等于-greater_equal
- 小于-less
- 小于等于-less_equal
关系运算符例:
// #include <functional> // 內建函数对象头文件 // #include <vector> // vector容器头文件 // #include <algorithm> // 标准算法头文件 // 仿函数 class MyCompare { public: bool operator()(int a, int b) { return a > b; } }; // 重载左移运算符来输出vector容器 ostream& operator<<(ostream& cout, vector<int>& v) { for (vector<int>::iterator it = v.begin(); it != v.end(); ++it) { cout << *it << " "; } return cout; } void test3() { vector<int> v; for (int i = 0; i < 10; ++i) { v.push_back(rand() % 15); } cout << v << endl; // 自定义的仿函数实现 // sort(v.begin(), v.end(), MyCompare()); // 内建函数对象 sort(v.begin(), v.end(), greater<int>()); // 大于 cout << v << endl; }
-
逻辑仿函数:
- 与-logical_and
- 或-logical_or
- 非-logical_not:一元运算符