• C++PrimerPlus(第6版)中文版:Chapter16.5.1函数对象_函数符概念


    很多STL算法都使用函数对象(也叫函数符functor)函数符是可以以函数方式与()结合使用的任意对象。

    STL也定义了函数符概念

    • 生成器:是不用参数就可以调用的函数符
    • 一元函数:是用一个参数可以调用的函数符
    • 二元函数:是用两个参数可以调用的函数符
    • 谓词:返回bool值的一元函数是谓词
    • 二元谓词:返回bool值的二元函数是二元谓词

     list模板有一个将谓词作为参数的remove_if()成员,该函数将谓词应用于区间中的每一个元素,如果谓词返回true,则删除这些元素。

    可以设计一个类,这个类初始化为不同的数值,来供remove_if()调用。具体请看例子代码:

    1. // functor.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
    2. //
    3. #include <iostream>
    4. #include <list>
    5. #include <iterator>
    6. #include <algorithm>
    7. template<class T>//functor class defines operator()()
    8. class TooBig
    9. {
    10. private:
    11. T cutoff;
    12. public:
    13. TooBig(const T &t):cutoff(t){}
    14. bool operator()(const T& v) { return v > cutoff; }
    15. };
    16. void outint(int n) { std::cout << n << " "; }
    17. int main()
    18. {
    19. //std::cout << "Hello World!\n";
    20. using std::list;
    21. using std::cout;
    22. using std::endl;
    23. TooBig<int>f100(100);//limit=100
    24. int vals[10] = { 50,100,90,180,60,210,415,88,188,201 };
    25. list <int> yadayada(vals,vals+10);//range conctor
    26. list<int> etcetera(vals,vals+10);
    27. //c++11 can use following instead
    28. //list <int> yadayada={50,100,90,180,60,210,415,88,188,201 }
    29. //list <int> etcetera={50,100,90,180,60,210,415,88,188,201 }
    30. cout << "Original lists:\n";
    31. for_each(yadayada.begin(),yadayada.end(),outint);
    32. cout << endl;
    33. for_each(etcetera.begin(), etcetera.end(), outint);
    34. cout << endl;
    35. yadayada.remove_if(f100);//use a named function object 使用一个命名的函数对象
    36. etcetera.remove_if(TooBig<int>(200));//construct a function object 使用匿名的函数对象
    37. cout << "Trimed Lists:\n";
    38. for_each(yadayada.begin(), yadayada.end(), outint);
    39. cout << endl;
    40. for_each(etcetera.begin(), etcetera.end(), outint);
    41. cout << endl;
    42. return 0;
    43. }

    运行结果:(大于100的被删除了,大于200的也删除了)这就是个过滤呗,挺好啊这想法。

    Original lists:
    50  100  90  180  60  210  415  88  188  201
    50  100  90  180  60  210  415  88  188  201
    Trimed Lists:
    50  100  90  60  88
    50  100  90  180  60  88  188

    16.5.2预定义的函数符 

    STL定义了多个基本函数符,它们执行诸如将两个数相加,比较两个值是否相等等操作。提供这些函数符是为了支持将函数作为参数的STL函数。例如考虑transform()函数,它有两个版本。咱们就说第一个版本。接受四个参数,前两个参数是指定容器区间的迭代器,第三个参数是指定结果放入到哪里的迭代器,第四个就是函数符,它应用于区间的每一个元素,生成结果中的新元素。这个说白了就是指明了:你要对谁做运算?(参数一,参数二来决定)算完了放哪里呢?(参数三来决定)怎么算 ?(参数4的函数符来决定,可以是开平方根,比较大小等)。这就是函数符的用武之地了。

  • 相关阅读:
    【android】View的事件体系3-弹性滑动
    中学校园IP网络广播系统解决方案-校园数字IP广播系统建设指南
    【KDD20】多变量时间序列异常检测算法之USAD:对抗性训练AE
    appium+jenkins实例构建
    虚拟机扩容
    函数(上)
    uniapp——授权报错,选择合适的基础库
    20220823 重积分链式系统有限时间镇定
    Java获取数组最大值、Java8的Arrays.sort()原理
    《数据结构与算法》-栈的概念和栈的实现
  • 原文地址:https://blog.csdn.net/superfreak/article/details/126950940