函数对象是一个好用的东西(Function Object),它不仅具有自己的状态(可以当作算法参数), 还在一般情况下可以内联获得更好的性能。当然,有些小的函数为获得较好的性能,是要经常被改写为函数对象的,如
vector < int > v( 10 );
// ....
sort(v, IntLess);
struct IntLess {bool operator ()(const int & a, const int & b) const { return a<b }};
如果这种情况多了,很麻烦。其实STL里面已经为我们定义好了一些常用的函数:
negate<type>() - param
plus<type>() param1 + param2
minus<type>() param 1 - param2
multiplies<type>()[4] param1 * param2
divides<type>() param1 / param2
modulus <type>() param1 % param2
equal_to<type>() param1 == param2
not_equal_to<type>() param1 ! = param2
less<type>() param1 < param2
greater<type>() param1 > param2
less_equal<type>() param1 <= param2
greater_equal<type>() param1 >= param2
logical_not<type>() ! param
logical_and<type>() param1 && param2
logical_or<type> () param1 | | param2除此之外,还有两个非常好用的函数适配器(Function Adapter)
bind1st (op,value) | op(value,param) |
bind2nd (op, value) | op(param,value) |
not 1(op) | !op(param) |
not2(op) | !op(param1 ,param2) |
其使用方法也十分简单,就不多介绍了。
find_if (coll.begin(),coll.end(), //range bind2nd (greater<int>(),42)) //criterion
其实还有更简单的写法,存在于boost之中。