C++初识仿函数

简介: C++初识仿函数

C++初识仿函数

![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/b03751cd455945bebbfba43d0d247b9c.gif#pic_center

📟作者主页:慢热的陕西人

🌴专栏链接:C++

📣欢迎各位大佬👍点赞🔥关注🚓收藏,🍉留言

本博客主要内容简单介绍了仿函数的概念


1.仿函数的介绍

我们可以从名字中看出仿函数就是一个仿造的函数,实际上也是如此,它并非一个真正的函数。而是通过一个类重载()运算符实现的。

接下来给出定义:

  • 仿函数是定义了一个含有**operator()**成员函数的对象,可以视为一个一般的函数,只不过这个函数功能是在一个类中的运算符operator()中实现,是一个函数对象,它将函数作为参数传递的方式来使用。

2.仿函数的优缺点

优点:

  • 仿函数比函数指针的执行速度快,函数指针时通过地址调用,而仿函数是对运算符operator进行自定义来提高调用的效率。
  • 仿函数比一般函数灵活,可以同时拥有两个不同的状态实体(即采用匿名对象和非匿名对象来调用),一般函数不具备此种功能
  • 仿函数可以作为模板参数使用,因为每个仿函数都拥有自己的类型

缺点:

  • 需要单独实现一个类。
  • 定义形式比较复杂。

3.简单实现一个仿函数的例子

通俗来讲,仿函数就是使用一个类通过重载()这个运算符实现的。

template<class T>
    //实现
  struct less
  {
    bool operator()(T& a, T& b)
    {
      return a < b;
    }
  };
  template<class T>
  struct greater
  {
    bool operator()(T& a, T& b)
    {
      return a > b;
    }
  };
//采用匿名对象的方式调用
void AdjustUp(int child)
    {
      int parent = (child - 1) >> 1;
      while (child)
      {
        //小堆
        //if (_con[child] < _con[parent])
        if(Compare()(_con[child], _con[parent]))
        {
          swap(_con[parent], _con[child]);
          child = parent;
        }
        else
        {
          return;
        }
      }
    }
    void AdjustDown(int parent)
    {
      //小堆
      int child = parent * 2 + 1;
      while (child < _con.size())
      {
        //找到两个孩子节点之中较小的那个
        //if (child + 1 < _con.size() && _con[child] > _con[child + 1])
        if (child + 1 < _con.size() && Compare()(_con[child], _con[child + 1]))
        {
          child += 1;
        }
        //if (_con[parent] > _con[child])
        if(Compare()(_con[parent], _con[child]))
        {
          swap(_con[parent], _con[child]);
          parent = child;
          child = parent * 2 + 1;
        }
        else
        {
          return;
        }
      }
    }
//采用实例化对象的方式调用
    void AdjustUp(int child)
    {
      Compare _com;
      int parent = (child - 1) >> 1;
      while (child)
      {
        //小堆
        //if (_con[child] < _con[parent])
        if(_com(_con[child], _con[parent]))
        {
          swap(_con[parent], _con[child]);
          child = parent;
        }
        else
        {
          return;
        }
      }
    }
    void AdjustDown(int parent)
    {
      Compare _com;
      //小堆
      int child = parent * 2 + 1;
      while (child < _con.size())
      {
        //找到两个孩子节点之中较小的那个
        //if (child + 1 < _con.size() && _con[child] > _con[child + 1])
        if (child + 1 < _con.size() && _com(_con[child], _con[child + 1]))
        {
          child += 1;
        }
        //if (_con[parent] > _con[child])
        if(_com(_con[parent], _con[child]))
        {
          swap(_con[parent], _con[child]);
          parent = child;
          child = parent * 2 + 1;
        }
        else
        {
          return;
        }
      }
    }

到这本篇博客的内容就到此结束了。
如果觉得本篇博客内容对你有所帮助的话,可以点赞,收藏,顺便关注一下!
如果文章内容有错误,欢迎在评论区指正

相关文章
|
5月前
|
C++ 容器
【C++】仿函数在模板中的应用——【默认模板实参】详解(n)
【C++】仿函数在模板中的应用——【默认模板实参】详解(n)
|
29天前
|
C++
C++(十七)仿函数
### Functor 仿函数简介 Functor(仿函数)是一种通过在类中实现 `operator()` 使其行为像函数的对象。这种方式可以让类拥有更多可定制的功能,同时保持函数般的简洁调用方式。下面展示了如何定义和使用一个计算幂运算的仿函数类,并通过示例说明了其在 `std::sort` 中的优势与灵活性。
|
3月前
|
存储 算法 Java
【C++】优先级队列priority_queue模拟实现&&仿函数
【C++】优先级队列priority_queue模拟实现&&仿函数
29 1
|
4月前
|
算法 安全 编译器
【C++进阶】模板进阶与仿函数:C++编程中的泛型与函数式编程思想
【C++进阶】模板进阶与仿函数:C++编程中的泛型与函数式编程思想
43 1
|
4月前
|
C++
C++函数对象(仿函数)
C++函数对象(仿函数)
|
5月前
|
算法 C语言 C++
从C语言到C++_20(仿函数+优先级队列priority_queue的模拟实现+反向迭代器)(上)
从C语言到C++_20(仿函数+优先级队列priority_queue的模拟实现+反向迭代器)
41 1
|
5月前
|
算法 C语言 C++
从C语言到C++_20(仿函数+优先级队列priority_queue的模拟实现+反向迭代器)(下)
从C语言到C++_20(仿函数+优先级队列priority_queue的模拟实现+反向迭代器)
24 0
从C语言到C++_20(仿函数+优先级队列priority_queue的模拟实现+反向迭代器)(下)
|
5月前
|
编译器 C语言 C++
【C++进阶(七)】仿函数深度剖析&模板进阶讲解
【C++进阶(七)】仿函数深度剖析&模板进阶讲解
|
12月前
|
算法 测试技术 C++
C++:优先级队列模拟实现和仿函数的概念使用
C++:优先级队列模拟实现和仿函数的概念使用
|
存储 算法 安全
04-📝C++核心语法|面向对象2【友元、内部类与局部类、强化训练(数组类封装)、运算符重载、仿函数、模板、类型转换、 C++标准、错误&&异常、智能指针】
复习`C++核心语法`,且适当进行汇编探索底层实现原理,进一步夯实基础,为以后的`底层开发`、`音视频开发`、`跨平台开发`、`算法`等方向的进一步学习埋下伏笔。
04-📝C++核心语法|面向对象2【友元、内部类与局部类、强化训练(数组类封装)、运算符重载、仿函数、模板、类型转换、 C++标准、错误&&异常、智能指针】