C++ 中的仿函数 functor

news2024/11/25 0:35:53

一   仿函数的概念

1. 定义

  仿函数(functor)是一种使用上像函数的类,其本质是一个实现了 operato() 函数的类,这种类就有了类似于函数一样的使用行为,这就是仿函数的类。

仿函数在 C++ STL标准库中被大量使用。

2. 特点

1. 仿函数是一个类,不是一个函数

2. 仿函数的类需要重载 operator() 函数,以此拥有函数的行为

二  STL 中常见的 仿函数介绍

1. 基类

  1.1  unary_function

 /**
   *  This is one of the @link functors functor base classes@endlink.
   */
  template<typename _Arg, typename _Result>
    struct unary_function
    {
      /// @c argument_type is the type of the argument
      typedef _Arg 	argument_type;   

      /// @c result_type is the return type
      typedef _Result 	result_type;  
    };

   作为拥有一个输入参数的仿函数常用基类,该类主要回答了两个问题:

     1. 该仿函数类的输入参数是什么类型:argument_type

     2. 该仿函数类的返回参数是什么类型: result_type

  1.2  binary_function

 /**
   *  This is one of the @link functors functor base classes@endlink.
   */
  template<typename _Arg1, typename _Arg2, typename _Result>
    struct binary_function
    {
      /// @c first_argument_type is the type of the first argument
      typedef _Arg1 	first_argument_type; 

      /// @c second_argument_type is the type of the second argument
      typedef _Arg2 	second_argument_type;

      /// @c result_type is the return type
      typedef _Result 	result_type;
    };

作为拥有两个输入参数的仿函数常用基类,该类主要回答了两个问题:

     1. 该仿函数类的输入参数是什么类型:first_argument_type 与 second_argument_type

     2. 该仿函数类的返回参数是什么类型: result_type

2.  STL 中常见仿函数

2.1  plus

 /// One of the @link arithmetic_functors math functors@endlink.
  template<typename _Tp>
    struct plus : public binary_function<_Tp, _Tp, _Tp>
    {
      _Tp
      operator()(const _Tp& __x, const _Tp& __y) const
      { return __x + __y; }
    };

2.2 minus

/// One of the @link arithmetic_functors math functors@endlink.
  template<typename _Tp>
    struct minus : public binary_function<_Tp, _Tp, _Tp>
    {
      _Tp
      operator()(const _Tp& __x, const _Tp& __y) const
      { return __x - __y; }
    };

2.3  multiplies

  /// One of the @link arithmetic_functors math functors@endlink.
  template<typename _Tp>
    struct multiplies : public binary_function<_Tp, _Tp, _Tp>
    {
      _Tp
      operator()(const _Tp& __x, const _Tp& __y) const
      { return __x * __y; }
    };

2.4  divides


  template<typename _Tp>
    struct divides : public binary_function<_Tp, _Tp, _Tp>
    {
      _Tp
      operator()(const _Tp& __x, const _Tp& __y) const
      { return __x / __y; }
    };

2.5  equal_to

 /// One of the @link comparison_functors comparison functors@endlink.
  template<typename _Tp>
    struct equal_to : public binary_function<_Tp, _Tp, bool>
    {
      bool
      operator()(const _Tp& __x, const _Tp& __y) const
      { return __x == __y; }
    };

2.6  less

 /// One of the @link comparison_functors comparison functors@endlink.
  template<typename _Tp>
    struct less : public binary_function<_Tp, _Tp, bool>
    {
      bool
      operator()(const _Tp& __x, const _Tp& __y) const
      { return __x < __y; }
    };

2.7  greater

/// One of the @link comparison_functors comparison functors@endlink.
  template<typename _Tp>
    struct greater : public binary_function<_Tp, _Tp, bool>
    {
      bool
      operator()(const _Tp& __x, const _Tp& __y) const
      { return __x > __y; }
    };

2.8   _Select1st

template<typename _Pair>
    struct _Select1st
    : public unary_function<_Pair, typename _Pair::first_type>
    {
      typename _Pair::first_type&
      operator()(_Pair& __x) const
      { return __x.first; }

      const typename _Pair::first_type&
      operator()(const _Pair& __x) const
      { return __x.first; }
    };

2.9  _Select2nd

template<typename _Pair>
    struct _Select2nd
    : public unary_function<_Pair, typename _Pair::second_type>
    {
      typename _Pair::second_type&
      operator()(_Pair& __x) const
      { return __x.second; }

      const typename _Pair::second_type&
      operator()(const _Pair& __x) const
      { return __x.second; }
    };

3. 使用例子

#include<algorithm>
#include<iostream>


int main()
{

     // 1. plus
    std::cout << "------ plus ------" << std::endl;
    std::vector<int>  vec = {1, 3, 5};
    std::plus<int> pl;
    int init = 0;
    int res1 = std::accumulate(vec.begin(), vec.end(), init, pl);
    std::cout << res1 << std::endl;
    std::cout << "------ plus ------" << std::endl; // 9


    // 2. minus
    std::cout << "------ minus ------" << std::endl;
    init = 10;
    std::minus<int> mis;
    int res2 =  std::accumulate(vec.begin(), vec.end(), init, mis);
    std::cout << res2 << std::endl; // 1

    std::cout << "------ minus ------" << std::endl;

    // 3. multies
    std::cout << "------ multies ------" << std::endl;
    init = 1;
    std::multiplies<int> multiply;
    int res3 = std::accumulate(vec.begin(), vec.end(), init, multiply);
    std::cout << res3 << std::endl; // 15

    std::cout << "------ multies ------" << std::endl;

    // 4. divides
    std::cout << "------ divides ------" << std::endl;
    init = 90;
    std::divides<int> divid;
    int res4 = std::accumulate(vec.begin(), vec.end(), init, divid);
    std::cout << res4 << std::endl; // 6

    std::cout << "------ divides ------" << std::endl;

    // 5. equal_to
    std::cout << "------ equal_to ------" << std::endl;

    std::pair<int, std::string> pair1 = std::make_pair(1, "abc");
    std::pair<int, std::string> pair2 = std::make_pair(2, "abc");

    std::equal_to<std::string> equal;
    std::_Select2nd<std::pair<int, std::string>> second_argu;
    std::cout << equal(second_argu(pair1), second_argu(pair2)) << std::endl;// 1
    std::cout << "------ equal_to ------" << std::endl;

    // 6. less
    std::cout << "------ less ------" << std::endl;

    std::less<int> less;
    std::cout << less(3, 6) << std::endl; // 1

    std::cout << "------ less ------" << std::endl;

    // 7. greater
    std::cout << "------ greater ------" << std::endl;
    std::greater<int> greater;
    std::cout << greater(3, 6) << std::endl; // 0

    std::cout << "------ greater ------" << std::endl;

    // 8. _Select1st
    std::cout << "------ _Select1st ------" << std::endl;
    std::pair<int, std::string> pair3 = std::make_pair(1, "abc");

    std::_Select1st<std::pair<int, std::string>> select1st;
    std::cout << select1st(pair3) << std::endl; // 1

    std::cout << "------ _Select1st ------" << std::endl;

    // 9. _Select2nd
    std::cout << "------ _Select2nd ------" << std::endl;
    std::pair<int, std::string> pair4 = std::make_pair(1, "abc");

    std::_Select2nd<std::pair<int, std::string>> select2nd;
    std::cout << select2nd(pair3) << std::endl; // abc

    std::cout << "------ _Select2nd ------" << std::endl;
    return 0;
}

输出:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1147404.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

图神经网络和分子表征:5. Completeness

大家都知道 “两点确定一线&#xff0c;三点确定一平面”&#xff0c;那么多少个变量可以确定一个分子呢&#xff1f;这是最近顶刊们热烈讨论的话题。 &#xff08;据笔者不完全统计&#xff09;最早在 SphereNet &#xff08;2022 ICLR&#xff09;论文里&#xff0c;摘要上就…

【多态-动态绑定-向上转型-抽象类】

文章目录 静态绑定动态绑定多态的具体实现向上转型多态的优缺点抽象类抽象类的作用 总结 静态绑定 重载就是典型例子 动态绑定 多态的具体实现 //多态 class Animal{public String name;public int age;//无参构造方法public Animal() {}//有参构造方法public Animal(Strin…

MySQL安装『适用于 CentOS 7』

✨个人主页&#xff1a; 北 海 &#x1f389;所属专栏&#xff1a; MySQL 学习 &#x1f383;操作环境&#xff1a; CentOS 7.6 腾讯云远程服务器 &#x1f381;软件版本&#xff1a; MySQL 5.7.44 文章目录 1.MySQL 的清理与安装1.1查看是否存在 MySQL 服务1.2.卸载原有服务1.…

每日Python:十个实用代码技巧

1、Jpg转Png 示例代码&#xff1a; # 图片格式转换, Jpg转Png# 方法① from PIL import Imageimg Image.open(demo.jpg) img.save(demo_open.png)# 方法② from cv2 import imread, imwriteimage imread("demo.jpg", 1) imwrite("demo_imread.png", im…

近年来上海高考数学命题趋势和备考建议,附1990年以来真题和解析

这篇文章六分成长为您介绍上海高考数学科目的一些分析和如何备考2024年的上海高考数学&#xff0c;并且为您提供1990-2023年的34年的上海高考数学真题和答案解析&#xff0c;供您反复研究。 一、上海高考数学题近年来的命题特点和趋势 1. 注重基础知识和基本技能&#xff1a;…

一文带你在GPU环境下配置YOLO8目标跟踪运行环境

本文介绍GPU下YOLO8目标跟踪任务环境配置、也即GPU下YOLO8目标检测任务环境配置。 YOLO8不仅仅可以实现目标检测&#xff0c;其还内置有Byte-Tracker、Bot-Tracker多目标跟踪算法。可以实现行人追踪统计、车流量跟踪统计等功能。值得注意的是Byte-Tracker、Bot-Tracker多目标跟…

全面详细讲解OSEK直接网络管理,并对比Autosar网管。

搞了两年的Autosar&#xff0c;用到的网络管理都是Autosar网络管理&#xff0c;虽然偶尔有听到或看到Osek网络管理&#xff0c;但是一直没机会具体进行开发和测试。最近有机会具体接触和开发到&#xff0c;弄完之后感受就是&#xff1a;还是Autosar的网络管理好用&#xff0c;O…

10、SpringCloud -- 优化重复下单

目录 优化重复下单问题的产生:需求:思路:代码:测试:优化重复下单 之前超卖、重复下单的解决方式 问题的产生: 比如这个秒杀活动没人去玩,只有一个人去参与秒杀,然后秒杀成功了,因为有联合索引,所以这个人他没法重复下单,但是他依然去请求秒杀,在秒杀的10个商品没…

设计模式大赏(一):桥接模式,组合模式

设计模式大赏&#xff08;一&#xff09;&#xff1a;桥接模式&#xff0c;组合模式 导言 本篇文章是设计模式大赏中的第一篇文章&#xff0c;这个系列的文章中我们主要将介绍一些常见的设计模式&#xff0c;主要是我在看Android源码中发现用到的一些设计模式。本篇文章将主要…

Android 快速实现隐私协议跳转链接

首先在string.xml创建对应字串 <string name"link">我已仔细阅读并同意<annotation value"privacy_policy">《隐私政策》</annotation>和<annotation value"service_agreement">《服务协议》</annotation></st…

十八、模型构建器(ModelBuilder)快速提取城市建成区——批量掩膜提取夜光数据、夜光数据转面、面数据融合、要素转Excel(基于参考比较法)

一、前言 前文实现批量投影栅格、转为整型,接下来重点实现批量提取夜光数据,夜光数据转面、夜光数据面数据融合、要素转Excel。将相关结果转为Excel,接下来就是在Excel中进行阈值的确定,阈值确定无法通过批量操作,除非采用其他方式,但是那样的学习成本较高,对于参考比较…

c++设计模式三:工厂模式

本文通过一个例子简单介绍简单工厂模式、工厂模式和抽象工厂模式。 1.简单工厂&#xff08;静态&#xff09; 假如我想换个手机&#xff0c;换什么手机呢&#xff1f;可以考虑苹果或者华为手机&#xff0c;那我们用简单工厂模式来实现这个功能&#xff1a; 我们关注的产品是手…

人工智能与航天技术的融合:未来发展的新趋势

人工智能与航天技术的融合&#xff1a;未来发展的新趋势 随着科技的飞速发展&#xff0c;人工智能和航天技术已经成为人类探索未知世界的重要工具。本文将探讨这两个领域的结合点&#xff0c;以及未来的发展趋势和应用前景。通过了解这些技术&#xff0c;读者将更好地理解人工…

用Python定义一个函数,用递归的方式模拟汉诺塔问题

【任务需求】 定义一个函数&#xff0c;用递归的方式模拟汉诺塔问题&#xff0c;三个柱子&#xff0c;分别为A、B、C&#xff0c;其中A柱子上有N个盘子&#xff0c;从小到大编号为1到N&#xff0c;盘子大小不同。现在要将这N个盘子从A柱子移动到C柱子上&#xff0c;但移动的过…

段页式管理方式

一、分段、分页的优缺点 1.分页管理&#xff1a;内存空间利用率高&#xff0c;无外部碎片&#xff0c;只有少量页内碎片&#xff0c;以物理结构划分&#xff0c;不便于按逻辑方式实现信息共享和保护 2.分段管理&#xff1a;为段长过大分配连续空间会很不方便&#xff0c;会产生…

Nginx动静分离以及防盗链问题

目录 1.动静分离 1.1概念 1.2准备环境 1.3.测试访问 2.Nginx防盗链问题 2.1nginx 防止网站资源被盗用模块 2.2防盗链配置 2.3准备两台机器 2.4测试 ①开启防盗链 ②让盗链ip可一访问服务资源 ③防盗链不设置none参数 1.动静分离 1.1概念 为了加快网站的解析速度&…

【图像分类】钢轨表面缺陷分类数据集介绍(4个类别)

写在前面&#xff1a; 首先感谢兄弟们的支持&#xff0c;让我有创作的动力&#xff0c;在创作过程我会尽最大能力&#xff0c;保证作品的质量&#xff0c;如果有问题&#xff0c;可以私信我&#xff0c;让我们携手共进&#xff0c;共创辉煌。 路虽远&#xff0c;行则将至&#…

Pytorch入门实例

数据集是受教育年限和收入,如下图 代码如下 import torch import numpy as np import matplotlib.pyplot as plt import pandas as pd import torch.nn as nn import torch.optim as optimdata pd.read_csv(./Income.csv)X torch.from_numpy(data.Education.values.reshape…

Windows环境下MosQuitto服务器搭建,安装mqtt服务端软件

1、下载、安装MosQuitto服务器 下载地址&#xff1a;http://mosquitto.org/files/binary/ 根据平台选择相应的代码下载。 安装完成后&#xff0c;安装文件夹下部分文件的功能

私有云:【9】Connection配置

私有云&#xff1a;【9】Connection配置 1、关闭IE增强配置2、Connection配置2.1、登录connection管理台配置许可证2.2、添加VCenter主机2.3、配置Composer 1、关闭IE增强配置 关闭此项 全部关闭 2、Connection配置 2.1、登录connection管理台配置许可证 上一章connection…