函数对象: (主要用途是用来搭配STL算法)
(1)函数对象:是一个重载了operator()的对象。
例如:
class FunctionObjectType
{
void operator() ()
{
statements;
}
}
这样定义的优势:
*函数对象比一般函数更灵巧,因为它可以拥有状态。
*每个函数对象都有其型别。
*执行速度上,函数对象比函数指针快些。
(2)函数对象的分类(以功能划分,定义于stl_function.h中)
1.算术类仿函数
*加法:plus<T>
*减法:minus<T>
*乘法:multiplies<T>
*除法:divides<T>
*模取:modulus<T>
*否定:negate<T>
2. 关系运算类仿函数:
*等于:equal_to<T>
*不等于:not_equal_to<T>
*大于:greater<T>
*大于或等于:greater_equal<T>
*小于:less<T>
*小于或等于:less_equal<T>
3. 逻辑运算类
*逻辑运算and :logical_and<T>
*逻辑运算or :logical_or<T>
*逻辑运算not :logical_not<T>
实例代码:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
/*
Function object定义:
Function object是一个对象,不过它的行为表现像函数。一般而言,它是由一个重载了operator()的类所实例化得来的对象。
函数对象就是一个重载了()运算符的对象,它可以像一个函数一样使用。
*/
template<typename T>
class Pred
{
private:
T _val;
public:
Pred(T val):_val(val){}
bool operator()(T val) //FunctionObject类一定要重载operator"()"
{
return val>_val;
}
};
void Test_Pred()
{
vector<int> iVec;
for(int i = 0; i < 100; i++)
{
iVec.push_back(i);
}
int count = count_if(iVec.begin(), iVec.end(), Pred<int>(50));
}
template <class T>
class AddValue {
private:
T theValue;
public:
AddValue(T v) : theValue(v) { }
void operator() (T& elem) const //FunctionObject类一定要重载operator"()"
{
elem += theValue;
}
};
void Test_AddValue()
{
vector<int> iVec;
for(int i = 0; i < 10; i++)
{
iVec.push_back(i);
}
for_each(iVec.begin(), iVec.end(), AddValue<int>(10));
}
int main(int argc, char* argv[])
{
Test_Pred();
Test_AddValue();
return 0;
}