引用c++标准函数库的定义:传递给算法的“函数型参数”,并不一定得是函数,可以是行为类似函数的对象,这种对象称为仿函数(一般速度比一般函数快)。
何为行为像个(类似)函数?:是指可以使用小括号传递参数,来调用某个东西。例如:
function(arg1,arg2);
1,一个简单例子
#include<iostream>
#include<list>
#include<algorithm>
#include<iterator>
#include<vector>
#include<stdlib.h>
using namespace std;
class print {
public:
void operator()(int ele)const {
cout << ele <<" ";
}
};
class my_cmp1 {
public:
bool operator()(const int &a, const int &b) {
return a < b;
}
};
struct my_cmp2 {
bool operator()(const int &a, const int &b) {
return a < b;
}
};
int main() {
vector<int> coll;//默认按升序
for (int i = 9; i > 0; i--) {
coll.push_back(i);
}
cout << "init: ";
copy(coll.begin(), coll.end(), ostream_iterator<int>(cout, " "));
cout << endl;
sort(coll.begin(), coll.end(), my_cmp2());//和使用my_cmp2()一个效果
cout << "sorted: ";
for_each(coll.begin(), coll.end(), print());
cout << endl;
system("pause");
return 0;
}
上面的简单例子列举了仿函数的简单写法可以使一个类的public方法,也可以使一个结构体的方法,都要重载()。
2,加入需要对一个容器中的所有值进行加一个数,如果这个数是确定的,那么可以使用一般函数,如下两种方式
//方式一,使用lambda表达式,该语句加到上面程序的sort()函数下面
for_each(coll.begin(), coll.end(), [](int &a)->void{ a = a + 10; });
//之前声明函数,然后调用
void add10(int &a) {
a = a + 10;
}
for_each(coll.begin(), coll.end(),add10);
如果要加的值不确定,而它们在编译期都已确定,可以使用template或类:
//使用template
#include<>
template <int thevalue>
void addvalue(int &ele) {
ele += thevalue;
}
//之后调用,实现加100,或其他值
for_each(coll.begin(), coll.end(), addvalue<100>);
//使用类
#include<>
class Addvalue {
private:
int thevalue;
public:
Addvalue(int val):thevalue(val){}
void operator()(int &ele)const {
ele += thevalue;
}
};
//调用使对应容器值加20
for_each(coll.begin(), coll.end(), Addvalue(20));
当然stl中也有预先定义的仿函数,比如常用的比较准则
set<int> col;中默认使用less<int>表示升序,全部不缺省为set<int,less<int> >; 也可以为greater<int>:降序;negate<int>:取相反数;multiplies<int>:取平方等