详解C++ functional库中的仿函数使用方法

目录
  • 一、仿函数简介
  • 二、仿函数简要写法示例
  • 三、使用C++自带的仿函数
    • (1)算术仿函数
    • (2)关系仿函数
    • (3)逻辑仿函数

一、仿函数简介

仿函数(functor)又称之为函数对象(function object),实际上就是 重载了()操作符 的 struct或class。
由于重载了()操作符,所以使用他的时候就像在调用函数一样,于是就被称为“仿”函数啦。

二、仿函数简要写法示例

一个很正常的需求,定义一个仿函数作为一个数组的排序规则:

将数组从大到小排序

class Cmp {
public:
    bool operator()(const int &a, const int &b) {
        return a > b;
    }
};

使用

vector<int> a(10);
iota(begin(a), end(a), 1);

sort(begin(a), end(a), Cmp());  // 使用()

for (auto x : a) {
  cout << x << " ";
}

输出

10 9 8 7 6 5 4 3 2 1

三、使用C++自带的仿函数

在C++ 的functional头文件中,已经为我们提供好了一些仿函数,可以直接使用。

(1)算术仿函数

1.plus 计算两数之和

例:将两个等长数组相加

    vector<int> a(10), b(a);
    iota(begin(a), end(a), 1);
    iota(begin(b), end(b), 1);

    transform(begin(a), end(a), begin(b), begin(a), plus<int>());

    for (auto x : a) {
        cout << x << " ";
    }

输出

2 4 6 8 10 12 14 16 18 20

2.minus 两数相减

将上面那个例子改一改:

transform(begin(a), end(a), begin(b), begin(a), minus<int>());

输出

0 0 0 0 0 0 0 0 0 0

3.multiplies 两数相乘

再将上面那个例子改一改:

transform(begin(a), end(a), begin(b), begin(a), multiplies<int>());

输出

1 4 9 16 25 36 49 64 81 100

4.divides 两数相除

还将上面那个例子改一改:

transform(begin(a), end(a), begin(b), begin(a), divides<int>());

输出

1 1 1 1 1 1 1 1 1 1

5.modules 取模运算

继续将上面那个例子改一改:

transform(begin(a), end(a), begin(b), begin(a), modulus<int>());

输出

0 0 0 0 0 0 0 0 0 0

6.negate 相反数

这次不能那样改了,因为上述的五个仿函数是二元仿函数,是对两个操作数而言的。

negate是一元仿函数,只能对一个参数求相反数。

所以我们对a数组求相反数:

transform(begin(a), end(a), begin(a), negate<int>());

输出

-1 -2 -3 -4 -5 -6 -7 -8 -9 -10

(2)关系仿函数

1.equal_to 是否相等

2.not_equal_to 是否不相等

3.greater 大于

4.less 小于

5.greater_equal 大于等于

6.less_equal 小于等于

到这时,我们就可以看出,可以使用 greater() 来代替我们开头实现的例子

将数组从大到小排序:

vector<int> a(10);
iota(begin(a), end(a), 1);

sort(begin(a), end(a), greater<int>());  // 使用()

for (auto x : a) {
  cout << x << " ";
}

输出

10 9 8 7 6 5 4 3 2 1

(3)逻辑仿函数

1.logical_and 二元,求&

2.logical_or 二元,求|

3.logical_not 一元,求!

使用方法同上.

话说,并没有发现求异或的仿函数..

到此这篇关于详解C++ functional库中的仿函数使用方法的文章就介绍到这了,更多相关C++仿函数内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++类重载函数的function和bind使用示例

    在没有C++11的std::function和std::bind之前,我们使用函数指针的方式是五花八门,结构很繁琐难懂.C++11中提供了std::function和std::bind统一了可调用对象的各种操作. 1.std::function简介 std::function首先是可调用对象,本质上生成了一个类(仿函数) 简单的使用如下代码 #include <unordered_map> #include <iostream> #include <functional>

  • C++中使用function和bind绑定类成员函数的方法详解

    定义一个普通的类 class Test1{ public: void fun(int val){ cout<<"hello world "<<val<<endl; } }; 开始第一个测试 int main(){ Test1 t; function<void(int)> pf = std::bind(&Test1::fun,t,2); pf(4); // return 0; } 输出的值是2,说明pf传进去的4并没有什么用,在bi

  • 理解C++编程中的std::function函数封装

    先来看看下面这两行代码: std::function<void(EventKeyboard::KeyCode, Event*)> onKeyPressed; std::function<void(EventKeyboard::KeyCode, Event*)> onKeyReleased; 这两行代码是从Cocos2d-x中摘出来的,重点是这两行代码的定义啊.std::function这是什么东西?如果你对上述两行代码表示毫无压力,那就不妨再看看本文,就当温故而知新吧. std::

  • c++11 符号修饰与函数签名、函数指针、匿名函数、仿函数、std::function与std::bind

    一.符号修饰与函数签名 1.符号修饰 编译器将c++源代码编译成目标文件时,用函数签名的信息对函数名进行改编,形成修饰名.GCC的C++符号修饰方法如下: 1)所有符号都以_z开头 2)名字空间的名字 名字空间(或类)的名字前加上N 名字前还有一个数字,是名字的字符数.比如1C,1是C的长度. 3)函数名 与名字空间一样,函数名前也有数字,比如4func,4是func的字符数. 4)参数 参数以E开头 例子 N::C::func(int) 的函数签名经过修饰为_ZN1N1C4funcEi 2.函

  • C++11 学习笔记之std::function和bind绑定器

    std::function C++中的可调用对象虽然具有比较统一操作形式(除了类成员指针之外,都是后面加括号进行调用),但定义方法五花八门.为了统一泛化函数对象,函数指针,引用函数,成员函数的指针的各种操作,让我们可以按更统一的方式写出更加泛化的代码,C++11推出了std::function. std::function是可调用对象的包装器.它是一个类模板,可以容纳除了类成员(函数)指针之外的所有可调用对象.通过指定它的模板参数,它可以用统一的方式处理函数,函数对象,函数指针,并允许保存和延迟

  • C++11中bind绑定器和function函数对象介绍

    目录 一. bind1st和bind2nd 1.C++ STL中的绑定器 2.bind1st和bind2nd的底层原理实现 二. 模板的完全特例化和非完全特例化 三. function函数对象 四. bind和function实现线程池 五. lambda表达式 1.lambda表达式的实现原理 2.lambda表达式的应用实践 一. bind1st和bind2nd 1.C++ STL中的绑定器 bind1st:operator()的第一个形参变量绑定成一个确定的值 bind2nd:operat

  • 详解Pycharm第三方库的安装及使用方法

    1.Pycharm第三方库的安装 方法一:pip install 包名:pip uninstall 包名. 方法二:pip install 下载路径\包名.whl (需要先下载第三包:地址:https://www.lfd.uci.edu/~gohlke/pythonlibs/,找到所需的包并下载保存),如下例安装gensim包所示: 方法三:若在pycharm编辑中,则在菜单setting/project/project interpreter中添加第三包.或者将第三方包放置于pycharm的s

  • 详解java8在Collection中新增加的方法removeIf

    记得我在以前找工作的经历中,遇到过一个面试官问过我一个很基础的问题.问题是:有一个List中有10个元素,我现在想从中删除3个元素,请问怎么做?我当时也没想,就直接说,List的有自带的remove方法,可以直接使用,他说请详细的说明一下,我说写一个for循环,循环的次数是List的长度,然后在循环里面直接删除掉想要删除的元素就可以了. 当时还想,这么简单的问题也问,面试官说,你回去自己试试就知道了,你看按照你说的那样写会不会报错.然后我就懵了,虽然这是个简单的问题但是日常的编码中,我还真没有注

  • 详解jQuery UI库中文本输入自动补全功能的用法

    自动补全(autocomplete),是一个可以减少用户输入完整信息的UI 工具.一般在 输入邮箱.搜索关键字等,然后提取出相应完整字符串供用户选择. 一.调用autocomplete()方法 $('#email').autocomplete({ source : ['aaa@163.com', 'bbb@163.com', 'ccc@163.com'], }); 二.修改autocomplete()样式    由于autocomplete()方法是弹窗,然后鼠标悬停的样式.通过Firebug

  • 详解iOS App开发中Cookie的管理方法

    一.何为Cookie Cookie是网站为了便是终端身份,保存在终端本地的用户凭证信息.Cookie中的字段与意义由服务端进行定义.例如,当用户在某个网站进行了登录操作后,服务端会将Cookie信息返回给终端,终端会将这些信息进行保存,在下一次再次访问这个网站时,终端会将保存的Cookie信息一并发送到服务端,服务端根据Cookie信息是否有效来判断此用户是否可以自动登录. 二.iOS中进行Cookie管理的两个类 iOS中进行HTTP网络请求Cookie管理主要由两个类负责,一个类是NSHTT

  • 详解JavaScript实现设计模式中的适配器模式的方法

    有的时候在开发过程中,我们会发现,客户端需要的接口和提供的接口发生不兼容的问题.由于特殊的原因我们无法修改客户端接口.在这种情况下,我们需要适配现有接口和不兼容的类,这就要提到适配器模式.通过适配器,我们可以在不用修改旧代码的情况下也能使用它们,这就是适配器的能力. 适配模式可用来在现有接口和不兼容的类之间进行适配,使用这种模式的对象又叫包装器(wrapper),因为它们是在用一个新的接口包装另一个对象. 从表面上看,适配器模式很像外观模式.它们都要对别的对象进行包装并改变其呈现的接口.二者的差

  • 详解在SpringBoot应用中获取应用上下文方法

    1.定义上下文工具类: package com.alimama.config; import org.springframework.context.ApplicationContext; /** * 上下文获取工具类 * @author mengfeiyang * */ public class SpringContextUtil { private static ApplicationContext applicationContext; public static void setAppl

  • 详解Android Material设计中阴影效果的实现方法

    View可以投下的阴影,一个View的elevation值决定了它的阴影的大小和绘制的顺序.可以设置一个视图的elevation,在布局中使用属性:android:elevation <TextView android:id="@+id/my_textview" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text=&quo

  • 详解iOS App开发中UIViewController的loadView方法使用

    当你访问一个ViewController的view属性时,如果此时view的值是nil,那么,ViewController就会自动调用loadView这个方法.这个方法就会加载或者创建一个view对象,赋值给view属性. loadView默认做的事情是:如果此ViewController存在一个对应的nib文件,那么就加载这个nib.否则,就创建一个UIView对象. 如果你用Interface Builder来创建界面,那么不应该重载这个方法. 控制器的loadView方法以及view属性

  • 详解使用zxing库生成QR-Code二维码

    详解使用zxing库生成QR-Code二维码 最近因为一些工作需要,需要根据实际的信息生成QR-Code二维码图片文件,自然想到zxing库了,具体的代码很简单,做个备忘. 首先是引入zxing库,我是使用maven构建项目的,添加依赖: <dependency> <groupId>com.google.zxing</groupId> <artifactId>javase</artifactId> <version>3.3.0<

  • 详解C 语言项目中.h文件和.c文件的关系

    详解C 语言项目中.h文件和.c文件的关系 在编译器只认识.c(.cpp))文件,而不知道.h是何物的年代,那时的人们写了很多的.c(.cpp)文件,渐渐地,人们发现在很多.c(.cpp)文件中的声明语句就是相同的,但他们却不得不一个字一个字地重复地将这些内容敲入每个.c(.cpp)文件.但更为恐怖的是,当其中一个声明有变更时,就需要检查所有的.c(.cpp)文件. 于是人们将重复的部分提取出来,放在一个新文件里,然后在需要的.c(.cpp)文件中敲入#include XXXX这样的语句.这样即

随机推荐