• C++ 函数对象


    目录

    函数对象:

    谓词:

    内建函数对象:

    1.算术仿函数

    2.关系仿函数

    3.逻辑仿函数


    函数对象:

    概念:重载函数调用操作符的类,其对象经常称为函数对象。函数对象使用重载的()时,行为类似函数调用,也叫仿函数。
    本质:函数对象(仿函数)是一个类,不是一个函数。
    1.函数对象可以像普通函数那样调用,可以有参数和返回值;
    2.函数对象超出普通函数的概念,函数对象可以有自己的状态;
    3.函数对象可以作为参数传递;

    1. #include <iostream>
    2. #include<string>
    3. using namespace std;
    4. class Myadd
    5. {
    6. public:
    7. int operator()(int a,int b)
    8. {
    9. return a+b;
    10. }
    11. };
    12. //1.函数对象可以像普通函数那样调用,可以有参数和返回值;
    13. void test01()
    14. {
    15. Myadd myadd1;
    16. int c=myadd1(1,2);
    17. cout<<c<<endl;
    18. }
    19. //2.函数对象超出普通函数的概念,函数对象可以有自己的状态;
    20. class Myprint
    21. {
    22. public:
    23. int count;//记录调用次数
    24. Myprint()
    25. {
    26. this->count=0;
    27. }
    28. void operator()(string str)
    29. {
    30. cout<<str<<endl;
    31. count++;
    32. }
    33. };
    34. void test02()
    35. {
    36. Myprint myprint;
    37. myprint("hello");
    38. myprint("hello");
    39. myprint("hello");
    40. myprint("hello");
    41. cout<<myprint.count<<endl;
    42. }
    43. //3.函数对象可以作为参数传递;
    44. void print03(Myprint &myprint,string s)
    45. {
    46. myprint(s);
    47. }
    48. void test03()
    49. {
    50. Myprint myprint2;
    51. print03(myprint2,"hello c++");
    52. }
    53. int main()
    54. {
    55. test01();
    56. test02();
    57. test03();
    58. return 0;
    59. }

    谓词:

    概念:
    1.返回bool类型的仿函数称为谓词;
    2.如果operator()接受一个参数,叫做一元谓词;
    3.如果operator()接受两个参数,则为二元谓词。

    1. #include <iostream>
    2. #include <vector>
    3. #include <algorithm>
    4. using namespace std;
    5. class Myfind
    6. {
    7. public:
    8. bool operator()(int val)//一元谓词
    9. {
    10. return val>5;
    11. }
    12. };
    13. void test01()
    14. {
    15. vector<int>v;
    16. for(int i=0;i<10;i++)
    17. v.push_back(i);
    18. vector<int>::iterator it=find_if(v.begin(),v.end(),Myfind());//寻找是否有大于5的数字,如果没有返回end
    19. if(it==v.end())
    20. {
    21. cout<<"No"<<endl;
    22. }
    23. else
    24. {
    25. cout<<*it<<endl;
    26. }
    27. }
    28. class Mycompare
    29. {
    30. public:
    31. bool operator()(int v1,int v2)//二元谓词
    32. {
    33. return v1>v2;
    34. }
    35. };
    36. void test02()
    37. {
    38. vector<int >v;
    39. v.push_back(10);
    40. v.push_back(20);
    41. v.push_back(90);
    42. v.push_back(70);
    43. v.push_back(40);
    44. v.push_back(60);
    45. sort(v.begin(),v.end());
    46. for(vector<int>::iterator it=v.begin();it!=v.end();it++)
    47. {
    48. cout<<*it<<" ";
    49. }
    50. cout<<endl;
    51. sort(v.begin(),v.end(),Mycompare());
    52. cout<<"------------------------------------------------"<<endl;
    53. for(vector<int>::iterator it=v.begin();it!=v.end();it++)
    54. {
    55. cout<<*it<<" ";
    56. }
    57. cout<<endl;
    58. }
    59. int main()
    60. {
    61. test01();
    62. test02();
    63. return 0;
    64. }

    内建函数对象:


    1.算术仿函数

    template<class T> T minus<T>;//减法
    template<class T> T multiplies<T>;//乘法
    template<class T> T plus<T>;//加法
    template<class T> T divides<T>;//除法
    template<class T> T modulus<T>;//取模
    template<class T> T negate<T>;//取反

    2.关系仿函数

    template<class T> bool equal_to<T>;//等于
    template<class T> bool not_equal_to<T>;//不等于
    template<class T> bool grater<T>;//大于
    template<class T> bool grater_equal<T>;//大于等于
    template<class T> bool less<T>;//小于
    template<class T> bool less_equal<T>;//小于等于

    3.逻辑仿函数

    template<class T> bool logical_and<T>;//逻辑与
    template<class T> bool logical_or<T>;//逻辑或
    template<class T> bool logical_not<T>;//逻辑非

    1. #include<functional>
    2. #include <iostream>
    3. #include<algorithm>
    4. #include <vector>
    5. using namespace std;
    6. void test01()
    7. {
    8. negate<int>n;
    9. cout<<n(40)<<endl;
    10. }
    11. void test02()
    12. {
    13. plus<int>p;
    14. cout<<p(10,20)<<endl;
    15. }
    16. void test03()
    17. {
    18. vector<int >v;
    19. v.push_back(10);
    20. v.push_back(20);
    21. v.push_back(90);
    22. v.push_back(70);
    23. v.push_back(40);
    24. v.push_back(60);
    25. sort(v.begin(),v.end(),greater<int>());// 内建关系仿函数调用
    26. for(vector<int>::iterator it=v.begin();it!=v.end();it++)
    27. {
    28. cout<<*it<<" ";
    29. }
    30. cout<<endl;
    31. }
    32. void test04()
    33. {
    34. vector<bool>v;
    35. v.push_back(true);
    36. v.push_back(false);
    37. v.push_back(true);
    38. v.push_back(false);
    39. for(vector<bool>::iterator it=v.begin();it!=v.end();it++)
    40. {
    41. cout<<*it<<endl;
    42. }
    43. cout<<endl;
    44. //利用逻辑非 将容器V 搬运到容器v2中,并执行操作
    45. vector<bool>v2;
    46. v2.resize(v.size());
    47. transform(v.begin(),v.end(),v2.begin(),logical_not<bool>());
    48. for(vector<bool>::iterator it=v2.begin();it!=v2.end();it++)
    49. {
    50. cout<<*it<<endl;
    51. }
    52. cout<<endl;
    53. }
    54. int main()
    55. {
    56. test01();
    57. test02();
    58. test03();
    59. test04();
    60. return 0;
    61. }

     

  • 相关阅读:
    06.webpack性能优化--构建速度
    redis方法 setIfAbsent
    HTTPS基础原理和配置-3
    Java · 数组 · 作为方法的参数 · 作为方法的返回值 · 二分查找 · 冒泡排序
    手机App防沉迷系统C卷(Java&&Python&&C++&&Node.js&&C语言)
    传统变化检测
    外包公司干了2个月,技术倒退两年...
    关于ChatGPT的一切;CUDA入门之矩阵乘;PyTorch 2.0发布|AI系统前沿动态
    Go 语言访问 Redis 笔记
    【NodeJs篇】npm和包
  • 原文地址:https://blog.csdn.net/wangcheng_BI/article/details/125405809