• 【C++】函数对象(仿函数)、谓词


    目录

    函数对象概念

    函数对象使用

    谓词概念

    一元谓词

    二元谓词


    函数对象概念

    概念

    • 重载函数调用操作符的类,其对象常称为函数对象
    • 函数对象使用重载 () 时,行为类似函数调用,称为仿函数

    本质

    • 函数对象(仿函数)是一个,不是函数

    函数对象使用

    特点

    • 函数对象可以和普通函数一样的调用方式,也可以传参,可以有返回值
    • 函数对象可以有自己的状态
    • 函数对象可以作为参数传递

    测试代码:

    1. #include
    2. using namespace std;
    3. class MyAdd {
    4. public:
    5. MyAdd() {
    6. this->num = 0;
    7. }
    8. int operator()(int v1, int v2) {
    9. num++;
    10. return (v1 + v2);
    11. }
    12. int num;
    13. };
    14. void doWork(MyAdd& ma, int v1, int v2) {
    15. cout << ma(v1, v2) << endl;;
    16. }
    17. void test() {
    18. MyAdd add;
    19. // 像普通函数那样使用
    20. cout << add(10, 20) << endl;
    21. cout << add(10, 20) << endl;
    22. cout << add(10, 20) << endl;
    23. // 更好的记录函数调用次数(自己的状态)
    24. cout << "add 函数对象调用次数:" << add.num << endl;
    25. // 作为参数传参
    26. doWork(add, 10, 20);
    27. }
    28. int main() {
    29. test();
    30. system("pause");
    31. return 0;
    32. }

    运行结果:


    谓词概念

    概念:

    • 返回 bool 类型的仿函数称为谓词
    • 如果 operator() 接受一个参数称为一元谓词
    • 如果 operator() 接受两个参数称为二元谓词

    一元谓词

    operator() 接受一个参数

    返回类型为 bool 类型的仿函数

    测试代码:

    1. #include
    2. using namespace std;
    3. #include
    4. #include
    5. class GreaterFive {
    6. public:
    7. bool operator()(int value) {
    8. return value > 5;
    9. }
    10. };
    11. void test() {
    12. vector<int>v;
    13. for (int i = 0; i < 10; i++) {
    14. v.push_back(i);
    15. }
    16. // 查找 > 5 的数,第三个参数为谓词,传入匿名函数对象
    17. vector<int>::iterator vit = find_if(v.begin(), v.end(), GreaterFive());
    18. if (vit == v.end()) {
    19. cout << "为找到" << endl;
    20. }
    21. else {
    22. cout << "找到" << *vit << endl;
    23. }
    24. }
    25. int main() {
    26. test();
    27. system("pause");
    28. return 0;
    29. }

    find_if 算法原型

    运行结果:


    二元谓词

    operator() 接受两个参数 

    仿函数返回类型为 bool 类型

    测试代码:

    1. #include
    2. using namespace std;
    3. #include
    4. #include
    5. class MyCompare {
    6. public:
    7. bool operator()(int value1, int value2) {
    8. return (value1 > value2);
    9. }
    10. };
    11. void test() {
    12. vector<int>v;
    13. v.push_back(20);
    14. v.push_back(50);
    15. v.push_back(30);
    16. v.push_back(40);
    17. v.push_back(10);
    18. // 排序操作
    19. sort(v.begin(), v.end());
    20. for (vector<int>::iterator it = v.begin(); it != v.end(); ++it) {
    21. cout << *it << " "; // 10 20 30 40 50
    22. }
    23. cout << endl;
    24. // 修改排序规则,传入二元谓词,匿名函数对象
    25. sort(v.begin(), v.end(), MyCompare());
    26. for (vector<int>::iterator it2 = v.begin(); it2 != v.end(); ++it2) {
    27. cout << *it2 << " "; // 50 40 30 20 10
    28. }
    29. cout << endl;
    30. }
    31. int main() {
    32. test();
    33. system("pause");
    34. return 0;
    35. }

     运行结果:

  • 相关阅读:
    小红书运营怎么做,快速提升品牌印象
    C语言:求n的阶乘
    Stable diffusion的架构解读(本博客还是以unet架构为主)
    Mysql5.7在线安装详细步骤
    HCNP Routing&Switching之MSTP
    【WSL】单机大模型前的基础环境配置
    ELK企业级日志分析系统
    Pass基础-DevOps
    excel动态图表
    性能优化-卡牌项目渲染优化
  • 原文地址:https://blog.csdn.net/xuan3215/article/details/126152573