一个类重载了运算符”()”,则该类的对象就成为函数对象
image.png

Dev C++中的 Accumulate

image.png

源码1

image.png

源码2

image.png

函数指针和函数对象分别作为参数实例

  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. #include <numeric>
  5. #include <functional>
  6. using namespace std;
  7. int sumSquares(int total, int value) {
  8. return total + value * value;
  9. }
  10. template <class T>
  11. void PrintInterval(T first, T last) {
  12. for(; first != last; ++first)
  13. cout << *first << " ";
  14. cout << endl;
  15. }
  16. template SumPowers {
  17. private:
  18. int power;
  19. public:
  20. SumPowers(int p):power(p) {}
  21. const T operator() (const T & total, const T & value) {
  22. T v = value;
  23. for(int i = 0; i < power - 1; ++i)
  24. v = v * value;
  25. return total + v;
  26. }
  27. };
  28. void main() {
  29. const int SIZE = 10;
  30. int a1[] = { 1,2,3,4,5,6,7,8,9,10 };
  31. vector<int> v(a1, a1+SIZE);
  32. cout << "1) "; PrintInterval(v.begin(), v.end());
  33. int result = accumulate(v.begin(), v.end(), 0, SumSquares);
  34. cout << "2) 平方和: " << result << endl;
  35. result = accumulate(v.begin(), v.end(), 0, SumPowers<int>(3));
  36. cout << "3) 立方和: " << result << endl;
  37. result = accumulate(v.begin(), v.end(), 0, SumPowers<int>(4));
  38. cout << "4) 4次方和: " << result;
  39. }
  • 函数指针和函数对象的实例化对比

image.png
image.png

  • 函数对象的好处在于,像上例中,容易修改想要累加的幂次这个参数;如果是函数指针想要实现这个功能,就必须使用全局变量或者写很多个这样的二次方三次方…的函数

    STL中的函数对象类模板

    image.png

    greater函数对象类

    image.png

    greater应用

    image.png
    image.png
    image.png

    引入函数对象后,STL中“大”“小”关系

    image.png

    实例:MyMax编写

    编写MyMax函数,满足如下程序:
    image.pngimage.png
    1. template <class T, class Pred>
    2. T MyMax(T * p, int n, Pred myless) {
    3. T tmp_max = p[0];
    4. for(int i = 1; i < n; ++i) {
    5. if(myless(tmp_max, p[i])
    6. tmp_max = p[i];
    7. }
    8. return p[i];
    9. }