侧边栏壁纸
博主头像
半生瓜のblog

THIS IS NO END.

  • 累计撰写 278 篇文章
  • 累计创建 3 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

【C++】C++仿函数(函数对象)

xuanxuan
2021-09-28 / 0 评论 / 0 点赞 / 10 阅读 / 0 字 / 正在检测是否收录...
温馨提示:
本文最后更新于2024-02-14,若内容或图片失效,请留言反馈。 部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

仿函数(函数对象)

研究set/multiset容器的排序原理。

当我们构造一个存放int类型的set容器时

set<int> s1;

系统会自动帮我们设定并调用一个函数,自动调用头文件functional中的仿函数(一个类中重载了()实现了对比的操作,从而完成了排序)。

set<int,less<int>> s1;

less函数对象实现比较,为排序提供依据。(升序) greater(降序)

functional中,如图

\[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-n2y3WzyW-1632820236223)(01仿函数functor.assets/image-20210928153035870.png)\]

手动实现:

#include<iostream>
#include<set>
using namespace std;
class Student
{
public:
    Student(int _age):age(_age)
    {

    }
    int getAge()const
    {
        return age;
    }
    bool operator < (const Student& right) const {
        return this->age < right.age;
    }

    bool operator > (const Student& right) const {
        return this->age > right.age;
    }

    ~Student() { } 
private:
    int age;
};

int main(void)
{
    set<Student,greater<Student>> setStu;
    setStu.insert(19);
    setStu.insert(20);
    setStu.insert(18);

    for (set<Student>::iterator it = setStu.begin(); it != setStu.end(); it++)
    {
        cout << it->getAge()<< endl;
    }

    return 0;
}

如果一个类将()运算符重载为成员函数,这个类就称为函数对象类,这个类的对象就是函数对象。函数对象是一个对象,但是使用的形式看起来像函数调用,实际上也执行了函数调用,因而得名。——C++函数对象详解

实现自己的less(greater)达到效果:

class FuncStudent
{
public:
    bool operator()(const Student& left, const Student& right)const
    {
        return left.getAge() > right.getAge();
    }
};
int main(void)
{
    set<Student,FuncStudent> setStu;
    Student s1(12);
    Student s2(13);
    setStu.insert(s1);
    setStu.insert(s2);

    for (set<Student,FuncStudent>::iterator it = setStu.begin(); it != setStu.end(); it++)
    {
        cout << it->getAge()<< endl;
    }

    return 0;
}

仿函数(函数对象)概念

  1. 尽管函数指针被广泛用于实现函数回调,但C++还提供了一个重要的实现回调函数的方法,那就是函数对象。回调函数解释——回调函数
  2. functor,翻译成函数对象,伪函数,它是是重载了“()”操作符的普通类对象。从语法上讲,它与普通函数行为类似。
  3. functional头文件中包含的 greater<>与less<>就是函数对象。

set/setmulti容器就是调用函数对象的operator()方法去比较两个值的大小,从而实现的排序。

0

评论区