仿函数:行为具有函数功能的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>()产生一个仿函数。