当前位置: 首页 >  技术宝典 >  c++ function使用

c++ function使用

导读:一、function介绍.funciotn是从c++11开始支持的特性,使用它需要包含头文件.在cppreference中解释为:类模板std::function是一个通用的多态函数包装器。std::function的实例可以对任何可以调用的目标实体进行存储、复制、和调用操作,这

一、function介绍

funciotn是从c++11开始支持的特性,使用它需要包含头文件

在cppreference中解释为:类模板std::function是一个通用的多态函数包装器。std::function的实例可以对任何可以调用的目标实体进行存储、复制、和调用操作,这些目标实体包括普通函数、Lambda表达式、函数指针、以及其它函数对象等。

通俗的来说可以把它当做一个函数指针来使用

二、function使用

function的模板是 std::function<返回值类型(传入参数类型)> 方法名

这里传入参数类型可以是自己定义的

举几个简单的例子:

std::function<int(int)> display;

这表示我定义了一个名为display的函数指针,它传入的参数类型是int,返回值类型也是int

struct student
{
    int age;
    int name;
};
int main(){
    std::function<int(student a)> student1;    
    return 0;
}

这里我自己定义了一个student类型,然后将student1的传入参数设置为student类型

如下是一个基本的用法

#include<iostream>
#include<functional>
#include<algorithm>

int show(int a)
{
    std::cout << a << std::endl;
    return 0;
}

int main(){

    std::function<int(int)> display = show;
    display(-5);

    return 0;
}

我们让这个display = show(这里要注意传入参数和返回值类型的匹配)代表着我们可以通过display来调用show,从而来输出我们想要输出的数字

然后我们来展示一下函数指针的用法

#include<iostream>
#include<functional>
#include<algorithm>

int add(int a)
{
    std::cout << ++a << “ ”;
    return a;
}
int decrease(int a)
{
    std::cout << --a << std::endl;
    return a;
}

int main(){
    std::function<int(int a)> a(&add);
    a(5);
    a = &decrease;
    a(5);

    return 0;
}

这里我们先让a执行add函数,然后让a = &decrease再执行decrease函数,执行出的结果为6 4

个人认为function最常用的是与lambda相结合,可以提高函数的灵活性

例如:

#include<iostream>
#include<functional>
#include<algorithm>

int main(){
    int arr[5] = {1, 5, 4, 8, 6};
    std::function<int(int a, int b)> cmp = [&](int a, int b)
    {
        return a > b;
    };

    sort(arr, arr + 5, cmp);
    for (int i = 0; i < 5; i++)
        std::cout << arr[i] << " ";
    return 0;
}  
输出的结果为8 6 5 4 1

通过function构造的一个cmp函数,结合lambda语法实现降序排列,这只是一个简单的用法,你可以构造其他的函数比如dfs等

内容
  • 绘画手残党的福音:涂鸦线稿秒变绝美图像
    绘画手残党的福音:涂鸦线稿秒变绝
    2023-12-08
    摘要: 涂鸦线稿秒变绝美图像,ControlNet-.Scribble2Img适配华为云ModelArts,提供更加便利
  • 线上服务器磁盘爆了,如何快速处理?
    线上服务器磁盘爆了,如何快速处理
    2023-12-08
    分享技术,用心生活.有一天突然收到预警短信,显示是服务器磁盘占用100% 心里一想这事大了,得赶紧处理啊!深一吸口气默念
  • 安全测试前置实践2-安全渗透测试
    安全测试前置实践2-安全渗透测试
    2023-12-04
    作者:京东物流 陈维.一、引言.本文我们将以围绕系统安全质量提升为目标,讲述在功能安全测试 &安全渗透测试上实践过程。.
  • 架构师日记-如何写的一手好代码
    架构师日记-如何写的一手好代码
    2023-12-06
    作者:京东零售 刘慧卿.一 前言.在日常工作中,我经常听到部分同学抱怨代码质量问题,潜台词是:“除了自己的代码,其他人写
  • 万字好文:大报文问题实战
    万字好文:大报文问题实战
    2023-12-02
    导读.大报文问题,在京东物流内较少出现,但每次出现往往是大事故,甚至导致上下游多个系统故障。大报文的背后,是不同商家业务
  • docker compose 快速安装 单机kafka版并且 持久化
    docker compose 快
    2023-12-05
    kafka 的业务场景不用多说了,耗时缓存队列,利用高吞吐以及队列模型实现 高并发情况下流量削峰,高流量的日志收集,都是