在C++中,在应用程序运行阶段存在的所有实体都是对象,因此struct和class也可用作函数,这称为函数对象。注意,函数也可通过函数指针来调用,他们也是函数对象。
从概念上说,函数对象是用作函数的对象;但从实现上说,函数对象是实现了operator()的类的对象。虽然函数和函数指针也可以归为函数对象,但实现了operator()的类的对象才能保存状态(即类的成员属性的值),才能用于STL算法。
接受一个参数的函数,叫做一元函数,如果一元函数返回布尔值,则该函数成为一元谓词;接受两个参数的函数为二元函数,如果返回一个布尔值,则该函数称为二元谓词。
1.一元函数
一元函数在实现STL算法for_each时使用的比较多。
通常定义一个struct
template <typename T>
struct DisplayElement
{
void operator() (const T& element)const
{
cout<<element<<' ';
}
};
同时,在for_each中的调用格式为:
for_each(someVector.begin(),someVector.end(),DisplayElement<type>() );
其中someVector为事先定义的某种容器,type为一种数据类型。这样联合起来就可以实现打印someVector中元素的功能。
2.一元谓词
返回布尔值的一元函数是谓词。这种函数可供STL算法进行判断。常用于find_if、remove_if以满足相应的情况来查找或者删除。
例如:
template <typename T>
struct IsMultiple
{
bool operator() (const T& element) const
{
return ((element%2)==0)
}
};
上例实现对偶数的筛选。
3.二元函数
如果函数 f(x,y)根据输入参数返回一个值,它将很有用。这种二元函数可用于对两个操作数执行运算,如加、减、乘、除等,如下面的二元函数返回输入参数的乘积:
template <typename T>
class CMultiply
{
public:
T operator() (const T& elem1,const T& elem2)
{
return (elem1*elem2);
}
};
4.二元谓词
接受两个参数并返回一个布尔值的函数是二元谓词。这种函数用于诸如std::sort等STL函数中,如下使用二元谓词对存储std::string 值的容器进行不区分大小写的排序。二元谓词::在判断两个对象时经常使用到。
class CCompareStringNoCase
{
public:
bool operator() (const string & str1,const string& str2) const
{
string str1LowerCase;
str1LowerCase.resize(str1.size());
transform(str1.begin(),str1.end(),str1LowerCase.begin(),::tolower);
string str2LowerCase;
str2LowerCase.resize(str2.size());
transform(str2.begin(),str2.end(),str1LowerCase.begin(),::tolower);
return (str1LowerCase<str2LowerCase);
}
};