函数对象:

重载函数调用操作符的类。其对象常称为函数对象(function object),即它们是行为类似函数的对象。

一个类对象,表现出一个函数的特征,就是通过“对象名+(參数列表)”的方式使用一个类对象,假设没有上下文,全然能够把它看作一个函数对待。

这是通过重载类的operator()来实现的。

“在标准库中。函数对象被广泛地使用以获得弹性”。标准库中的非常多算法都能够使用函数对象或者函数来作为自定的回调行为;

demo

  1. #include <iostream>
  2. #include <cstdio>
  3.  
  4. using namespace std;
  5.  
  6. // 函数对象。类重载了()
  7. template <typename T>
  8. class ShowElement
  9. {
  10. public:
  11. // 重载()
  12. void operator()(T &t) {
  13. cout << t << endl;
  14. }
  15. protected:
  16. private:
  17. int n;
  18. };
  19.  
  20. // 函数模版
  21. template <typename T>
  22. void FuncShowElement(T &t)
  23. {
  24. cout << t << endl;
  25. }
  26.  
  27. // 普通函数
  28. void FuncShowElement2(int &t)
  29. {
  30. cout << t << endl;
  31. }
  32.  
  33. void play01()
  34. {
  35. int a = 10;
  36. ShowElement<int> showElement;
  37. showElement(a); // 函数对象的调用,非常像一个函数,所以叫仿函数
  38. // 10
  39.  
  40. FuncShowElement<int>(a);
  41. FuncShowElement2(a);
  42.  
  43. }
  44.  
  45. int main()
  46. {
  47. play01();
  48.  
  49. return 0;
  50. }

上面简单演示了函数对象的使用以及和普通函数定义的异同,看以下的demo。

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <vector>
  4. #include <algorithm>
  5.  
  6. using namespace std;
  7.  
  8. // 函数对象,类重载了()
  9. template <typename T>
  10. class ShowElement
  11. {
  12. public:
  13. ShowElement()
  14. {
  15. n = 0;
  16. }
  17. // 重载()
  18. void operator()(T &t) {
  19. ++n;
  20. cout << t << ' ';
  21. }
  22.  
  23. void printN()
  24. {
  25. cout << "n: " << n << endl;
  26. }
  27. protected:
  28. private:
  29. int n;
  30. };
  31.  
  32. // 函数模版
  33. template <typename T>
  34. void FuncShowElement(T &t)
  35. {
  36. cout << t << ' ';
  37. }
  38.  
  39. // 普通函数
  40. void FuncShowElement2(int &t)
  41. {
  42. cout << t << ' ';
  43. }
  44.  
  45. void play01()
  46. {
  47. int a = 10;
  48. ShowElement<int> showElement;
  49. showElement(a); // 函数对象的调用,非常像一个函数,所以叫仿函数
  50. // 10
  51.  
  52. FuncShowElement<int>(a);
  53. FuncShowElement2(a);
  54.  
  55. }
  56.  
  57. // 函数对象的优点
  58. // 函数对象属于类对象,能突破函数的概念。能保持调用状态信息
  59. void play02()
  60. {
  61. vector<int> v;
  62. v.push_back(1);
  63. v.push_back(3);
  64. v.push_back(5);
  65.  
  66. for_each(v.begin(), v.end(), ShowElement<int>()); // 匿名函数对象,匿名仿函数
  67. cout << endl;
  68. // 1 3 5
  69.  
  70. for_each(v.begin(), v.end(), FuncShowElement2); // 通过回调函数
  71. cout << endl;
  72. // 1 3 5
  73.  
  74. // 改写一下类ShowElement
  75. ShowElement<int> showElement;
  76. /* for_each函数原型
  77.  
  78. template<class _InIt,
  79. class _Fn1> inline
  80. _Fn1 for_each(_InIt _First, _InIt _Last, _Fn1 _Func)
  81. { // perform function for each element
  82. _DEBUG_RANGE(_First, _Last);
  83. _DEBUG_POINTER(_Func);
  84. _For_each(_Unchecked(_First), _Unchecked(_Last), _Func);
  85.  
  86. return (_STD move(_Func));
  87. }
  88. */
  89. // 能够看出for_each算法的函数对象传递是元素值传递。不是引用传递
  90. for_each(v.begin(), v.end(), showElement);
  91. cout << endl;
  92. showElement.printN(); // 所以这里打印结果并非我们预期的3
  93. // n: 0
  94.  
  95. // 解决方式。for_each最后是把传进去的函数对象做了值返回
  96. showElement = for_each(v.begin(), v.end(), showElement);
  97. cout << endl;
  98. showElement.printN(); // bingo
  99. // n: 3
  100. }
  101.  
  102. int main()
  103. {
  104. //play01();
  105. play02();
  106.  
  107. return 0;
  108. }

结论:分清楚STL算法返回的值是迭代器还是谓词(函数对象)是非常重要的。

STL算法设计理念 - 函数对象和函数对象当參数和返回值的更多相关文章

  1. /编写一个函数,要求从给定的向量A中删除元素值在x到y之间的所有元素(向量要求各个元素之间不能有间断), 函数原型为int del(int A ,int n , int x , int y),其中n为输入向量的维数,返回值为删除元素后的维数

    /** * @author:(LiberHome) * @date:Created in 2019/2/28 19:39 * @description: * @version:$ */ /* 编写一个 ...

  2. STL算法设计理念 - 预定义函数对象

    预定义函数对象基本概念:标准模板库STL提前定义了很多预定义函数对象 1)使用预定义函数对象: #include <iostream> #include <cstdio> #i ...

  3. STL算法设计理念 - 函数对象和函数对象当参数和返回值

    函数对象: 重载函数调用操作符的类,其对象常称为函数对象(function object),即它们是行为类似函数的对象.一个类对象,表现出一个函数的特征,就是通过"对象名+(参数列表)&qu ...

  4. STL算法设计理念 - 函数适配器

    1)函数适配器的理论知识 2)常用函数函数适配器 标准库提供一组函数适配器,用来特殊化或者扩展一元和二元函数对象.常用适配器是: 1.绑定器(binder): binder通过把二元函数对象的一个实参 ...

  5. python--函数的返回值、函数参数的使用、名称空间与作用域、函数嵌套、函数对象

    今天学习内容有函数的返回值.函数参数的使用.名称空间与作用域.函数嵌套. 下来我们一一查看. 函数的返回值 看几个栗子: def func(x): y=func() print(y) def foo( ...

  6. STL算法设计理念 - 谓词,一元谓词demo

    谓词: 一元函数对象:函数参数1个: 二元函数对象:函数参数2个: 一元谓词 函数参数1个,函数返回值是bool类型,可以作为一个判断式 谓词可以使一个仿函数,也可以是一个回调函数. demo 一元谓 ...

  7. VC与JavaScript交互(三) --- CWebPage类调用javascript函数(给js函数传参,并取得返回值)

    ①需要一个别人写好的类CWebPage,将其对于的两个文件WebPage.h和WebPage.cpp添加到工程中. ②添加WebBrowser控件,在视图/对话框类的头文件中#include &quo ...

  8. VC/MFC中通过CWebPage类调用javascript函数(给js函数传参,并取得返回值)

    转自:http://www.cnblogs.com/javaexam2/archive/2012/07/14/2632959.html ①需要一个别人写好的类CWebPage,将其对于的两个文件Web ...

  9. JS基础研语法---函数基础总结---定义、作用、参数、返回值、arguments伪数组、作用域、预解析

    函数: 把一些重复的代码封装在一个地方,在需要的时候直接调用这个地方的代码就可以了 函数作用: 代码重用 函数的参数: 形参:函数定义的时候,函数名字后面的小括号里的变量 实参:函数调用的时候,函数名 ...

随机推荐

  1. workstation服务丢失 共享打不开 0x80070035

    这个问题困扰一个星期了,希望能帮到人.

  2. 这是一条立了Flag的不归路

    时间2017年7月11日 14:48:40 首次激活博客园的博客来进行学习记录,立下了不算远大的小目标,下一步就是要一步一步的往前走. Java是目前最普遍的使用语言之一,作为一名测试,本应该去学习更 ...

  3. ERStudio8.0 破解版 下载

    下面地址亲测有效 https://blog.csdn.net/weixin_37139761/article/details/83856069

  4. 多线程下单例模式的实现_ThreadLocal_ReentrantLock

    package threadStudy; public class MultiThreadSingleInstance { // volatile 防止指令重排 private static vola ...

  5. Windows:32位程序运行在64位系统上注册表会重定向

    参考资料 微软注册表英文文档 StackOverflow社区回答 1.注册表位置 64bit系统(Windows Server 2008 R2只有64bit系统)的注册表分32 位注册表项和64位注册 ...

  6. Ubuntu16.04 python3.4.3升级到python3.7.1

    python有两个版本,一个2版本,使用的是python:另一个是3版本,使用的是python3. 简易安装python后得到的3版本的版本号是python3.4.3. 可以使用下面的命令查看py版本 ...

  7. EasyUI入门,DataGrid(数据表格)

    搭建EasyUI 1.进入官网,下载EasyUI的程序包.地址:http://www.jeasyui.com/download/list.php 2.先导入css样式,引入程序包 3.进入EasyUI ...

  8. hdfs的特性、命令、安全模式、基准测试

    1.第一点:如何理解hdfs分布式文件系统,每台机器出一块磁盘,凑成一个大的硬盘,大的硬盘的容量来自各个服务器的硬盘容量之和. 你出5毛,我出5毛,大家凑成1块. 2. HDFS 是 Hadoop D ...

  9. shell learning note

      shell learning note MAIN="/usr/local/" # 变量大写 STATUS="$MAIN/status" # 美元符加字符串是 ...

  10. Oracle排名函数(Rank)实例详解

    这篇文章主要介绍了Oracle排名函数(Rank)实例详解,需要的朋友可以参考下     --已知:两种排名方式(分区和不分区):使用和不使用partition --两种计算方式(连续,不连续),对应 ...