仿函数:行为具有函数功能的class的对象就是仿函数。
仿函数一般有成员函数 ret_type operator()(arguments)const;
仿函数的优点:
1.仿函数是对象,可以拥有成员函数和成员变量,即仿函数拥有状态(states)
2.每个仿函数都有自己的类型
3.仿函数通常比一般函数快(很多信息编译期确定)
例如:
class PrintInt {
public:
void operator() (int elem) const {
cout << elem << ' ';
}
};
int main()
{
vector<int> coll;
// insert elements from 1 to 9
for (int i=1; i<=9; ++i) {
coll.push_back(i);
}
// print all elements
for_each (coll.begin(), coll.end(), // range
PrintInt()); // operation
cout << endl;
}
二,预先定义的仿函数
stl中预定义了很多的仿函数。例如:
set<int> coll;
会被扩展成:
set<int, less<int>> coll;
其中less<int>就是一个仿函数(class)。
又如
transform(coll.begin(), coll.end(), coll.begin(), negate<int>());
negate<int>()是预定义仿函数。
又如
transform(coll.begin(), coll.end(), coll.begin(), coll.begin(), multiplies<int>());
multiplies<int>()是预定义仿函数。
又如:
#include <iostream>
#include <set>
#include <deque>
#include <algorithm>
#include "print.hpp"
using namespace std;
int main()
{
set<int,greater<int> > coll1;
deque<int> coll2;
// insert elements from 1 to 9
for (int i=1; i<=9; ++i) {
coll1.insert(i);
}
PRINT_ELEMENTS(coll1,"initialized: ");
// transform all elements into coll2 by multiplying 10
transform (coll1.begin(),coll1.end(), // source
back_inserter(coll2), // destination
bind2nd(multiplies<int>(),10)); // operation
PRINT_ELEMENTS(coll2,"transformed: ");
// replace value equal to 70 with 42
replace_if (coll2.begin(),coll2.end(), // range
bind2nd(equal_to<int>(),70), // replace criterion
42); // new value
PRINT_ELEMENTS(coll2,"replaced: ");
// remove all elements with values less than 50
coll2.erase(remove_if(coll2.begin(),coll2.end(), // range
bind2nd(less<int>(),50)), // remove criterion
coll2.end());
PRINT_ELEMENTS(coll2,"removed: ");
}
bind2nd(multiplies<int>()产生一个仿函数。