C++中的标准函数对象

  1. 函数对象
  2. 函数对象是一种利用句法规则特定设计的类生成的对象,它的作用类似于函数。
  3. 在C++中,这是通过在类中定义成员函数operator()实现的,举个例子:
  4. struct myclass {
  5.     int operator()(int a) {return a;}
  6. }myobject;
  7. int x = myobject(0);
  8. 它们作为断定或者比较功能和标准算法(algorithms)一起使用时将非常有用。
  9. 在头文件<functional>中标准库提供了好几种标准的函数对象和一些修改方法以适应它们自己的行为。
  10. 基类
  11. unary_function  一元的函数对象基类
  12. template <class Arg, class Result>
  13.   struct unary_function {
  14.     typedef Arg argument_type;
  15.     typedef Result result_type;
  16.   };
  17. binary_function 二元的函数对象基类
  18. template <class Arg1, class Arg2, class Result>
  19.   struct binary_function {
  20.     typedef Arg1 first_argument_type;
  21.     typedef Arg2 second_argument_type;
  22.     typedef Result result_type;
  23.   };
  24. 算子类
  25. 算术操作符
  26. plus        +   加函数对象类  
  27. template <class T> struct plus : binary_function <T,T,T> {
  28.   T operator() (const T& x, const T& y) const
  29.     {return x+y;}
  30. };
  31. minus       -   减函数对象类
  32. 同理,这里就不一一列举
  33. multiplies  *   乘函数对象类
  34. divides     /   除函数对象类
  35. modulus     %   模函数对象类
  36. negate      -   负函数对象类
  37. 比较操作符
  38. equal_to    ==  函数对象类用于相等比较
  39. template <class T> struct equal_to : binary_function <T,T,bool> {
  40.   T operator() (const T& x, const T& y) const
  41.     {return x==y;}
  42. };
  43. not_equal_to    !=  函数对象类用于不相等比较
  44. 同理,这里就不一一列举
  45. greater     >   函数对象类用于大于比较
  46. less        <   函数对象类用于小于比较
  47. greater_equal   >=  函数对象类用于不小于比较
  48. less_equal  <=  函数对象类用于不大于比较
  49. 逻辑操作符
  50. logical_and &&  逻辑与函数对象类
  51. logical_or  ||  逻辑或函数对象类
  52. logical_not !   逻辑非函数对象类
  53. 适配器和转换功能
  54. 否定器
  55. not1    返回一元函数对象的反面
  56. template <class Predicate>
  57. unary_negate<Predicate> not1 (const Predicate& pred)
  58. {
  59.   return unary_negate<Predicate>(pred);
  60. }
  61. not2    返回二元函数对象的方面
  62. template <class Predicate>
  63. binary_negate<Predicate> not2 (const Predicate& pred)
  64. {
  65.   return binary_negate<Predicate>(pred);
  66. }
  67. 参数绑定器
  68. bind1st     返回绑定了第一个参数的函数对象
  69. template <class Operation, class T>
  70. binder1st<Operation> bind1st (const Operation& op, const T& x)
  71. {
  72.   return binder1st<Operation>(op, typename Operation::first_argument_type(x));
  73. }
  74. bind2nd     返回绑定了第二个参数的函数对象
  75. template <class Operation, class T>
  76. binder2nd<Operation> bind2nd (const Operation& op, const T& x)
  77. {
  78.   return binder2nd<Operation>(op, typename Operation::second_argument_type(x));
  79. }
  80. 有用的类型
  81. unary_negate    生成一元函数对象类的反面
  82. template <class Predicate> class unary_negate
  83.   : public unary_function <typename Predicate::argument_type,bool>
  84. {
  85. protected:
  86.   Predicate fn;
  87. public:
  88.   explicit unary_negate ( const Predicate& pred ) : fn (pred) {}
  89.   bool operator() (const typename Predicate::argument_type& x) const
  90.   { return !fn(x); }
  91. };
  92. binary_negate   生成二元函数对象类的反面
  93. template <class Predicate> class binary_negate
  94.   : public binary_function <typename Predicate::first_argument_type,
  95.                             typename Predicate::second_argument_type, bool>
  96. {
  97. protected:
  98.   Predicate fn;
  99. public:
  100.   explicit binary_negate ( const Predicate& pred ) : fn (pred) {}
  101.   bool operator() (const typename Predicate::first_argument_type& x,
  102.                    const typename Predicate::second_argument_type& y) const
  103.   { return !fn(x,y); }
  104. };
  105. binder1st   绑定了第一个参数的函数对象类
  106. template <class Operation> class binder1st
  107.   : public unary_function <typename Operation::second_argument_type,
  108.                            typename Operation::result_type>
  109. {
  110. protected:
  111.   Operation op;
  112.   typename Operation::first_argument_type value;
  113. public:
  114.   binder1st ( const Operation& x,
  115.               const typename Operation::first_argument_type& y) : op (x), value(y) {}
  116.   typename Operation::result_type
  117.     operator() (const typename Operation::second_argument_type& x) const
  118.     { return op(value,x); }
  119. };
  120. binder2nd   绑定了第二个参数的函数对象类
  121. template <class Operation> class binder2nd
  122.   : public unary_function <typename Operation::first_argument_type,
  123.                            typename Operation::result_type>
  124. {
  125. protected:
  126.   Operation op;
  127.   typename Operation::second_argument_type value;
  128. public:
  129.   binder2nd ( const Operation& x,
  130.               const typename Operation::first_argument_type& y) : op (x), value(y) {}
  131.   typename Operation::result_type
  132.     operator() (const typename Operation::first_argument_type& x) const
  133.     { return op(x,value); }
  134. };
  135. 还有一小部分没有翻译(这部分我还没看呢),以后另起补上。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值