在使用STL库中,我们使用 sort 函数,在进行比较大小的时候,第三个参数有两种选择,第一种是以函数指针的形式,第二种是以函数对象的形式。
// sort algorithm example
#include <iostream> // std::cout
#include <algorithm> // std::sort
#include <vector> // std::vector
bool myfunction (int i,int j) { return (i<j); }
struct myclass {
bool operator() (int i,int j) { return (i<j);}
} myobject;
int main () {
int myints[] = {32,71,12,45,26,80,53,33};
std::vector<int> myvector (myints, myints+8); // 32 71 12 45 26 80 53 33
// using default comparison (operator <):
std::sort (myvector.begin(), myvector.begin()+4); //(12 32 45 71)26 80 53 33
// using function as comp
std::sort (myvector.begin()+4, myvector.end(), myfunction); // 12 32 45 71(26 33 53 80)
// using object as comp
std::sort (myvector.begin(), myvector.end(), myobject); //(12 26 32 33 45 53 71 80)
//std::sort(myvector.begin(), myvector.end(), myclass());
// print out content:
std::cout << "myvector contains:";
for (std::vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
std::cout << ' ' << *it;
std::cout << '\n';
return 0;
}
- 函数对象:
所有重载了函数调用操作符(operator())的类对象,又称为函数子。在STL中,大多数使用函数子的地方都可以使用函数指针(ps:set和multiset的比较类型必须是函数对象,而不能是函数指针)通过将operator设置为内联函数,可以使程序性能加速。
struct myfunc{
bool operator()(int a, int b){
return a < b;
}
}
or
class myclass{
public:
bool operator()(int a, int b){
return a < b;
}
}
sort(myvec.begin(), myvec.end(), myfunc());
- 函数指针:
指向某种(函数参数,返回值)的函数类型的指针,每个函数都有一个入口地址,函数指针便是指向了函数的入口地址。通过将函数指针传入函数中,方便一个函数调用另一类型的函数。如: int GetMaxValue( double x, bool (*ptr)(int, int) ),其中ptr即为函数指针。
- 函数对象的优势
(1)函数对象通过重载()实现,那么将operator()函数设置为内联函数,可以提高程序的运行速度。如上面的例子,相比于传入greaterNum函数指针为sort的第三个形参,传入是GreaterNum<int>函数子时,程序运行的速度快。因为内联函数在编译时展开,而函数指针要进行调用。
(2)函数对象可以携带附加信息,如类的其他数据成员,而函数指针则做不到。
函数语句经过编译器编译后,生成的都是二进制代码,每个函数模块都有一个首地址。而这个首地址,就是函数的入口地址,或者说是函数指针。
对于一个已经定义的函数,它的名字就是函数的入口地址。
对于函数名,加* 加& 的作用,希望大家可以讲一讲,俺不会。