一、仿函数的简介
1、什么是仿函数
其实就是一个对象,这不过这个对象重载了operator( ),可以像函数一样使用它
2、仿函数出现的意义
要想然一个“操作”作为算法的参数,唯一的办法就是给这个操作设计为一个函数,然后将函数指针作为算法的一个参数;
或者为这个操作设计出一个仿函数,然后通过仿函数产生一个对象,然后将这个对象作为算法的一个操作
3、为什么有了函数指针还需要仿函数?
因为这样可以于STL的其他组件相结合(如配接器相结合),为了可以与c++的模版,满足c++的封装的思想,可以具体的实现屏蔽,这其实是一种哲学上的思想
(函数和对象的不同,对象里面可以保存数据,而函数只能实现具体的方法)
4、仿函数的使用方法
(1)先用仿函数产生对象,然后这个对象再去调用operator()
(2)也可以产生无名的临时对象来履行函数的功能
仿函数的第二种用法不常见,但是确实仿函数的
主流用法
5、仿函数按功能进行划分:
(1)算术运算符
(2)关系运算符
(3)逻辑运算符
5、为什么可以实现仿函数
仿函数得一实现主要是由于STL有配接器功能,实现仿函数的配接器
6、STL中的仿函数
STL中的仿函数只有一元和二元的,没有三元的,并且
仿函数是没有任何的成员变量和成员函数的
7、仿函数也有内置型别:
第一个参数型别、第二个参数型别以及返回值型别
template<class Arg1,class Arg2.class Result>
struct Compare
{
typedef Arg1 FirstArgumentType;
typedef Arg2 SecondArgumentType;
typedef Result ResultType;
};
这样用户变可以取得该仿函数的各种相应的型别
二、算术类的仿函数
.+ - * / % negate
貌似operator+是不加&的,因为是返回一个临时变量的值、
template<class T>
struct Plus
{
T operator(const T& x, const T& y)
{
return x + y;
}
};
三、关系运算类的仿函数
template<class T>
struct Compare
{
bool operator( ) (const T& x, const T& y)
{
return x < y;
}
};
四、逻辑类的仿函数
逻辑与,逻辑或,逻辑非
template<class T>
struct And
{
bool operator()(const T& x, const T& y)
{
return x&&y;
}
};
五、实现选择的功能
哈希表的哈希函数就用到了这个功能,通过对于仿函数的特化实现这一功能