一、function介绍
funciotn是从c++11开始支持的特性,使用它需要包含<functional>头文件
在cppreference中解释为:类模板std::function
是一个通用的多态函数包装器。std::function的实例可以对任何可以调用的目标实体进行存储、复制、和调用操作,这些目标实体包括普通函数、Lambda表达式、函数指针、以及其它函数对象等。
通俗的来说可以把它当做一个函数指针来使用
二、function使用
function的模板是 std::function<返回值类型(传入参数类型)> 方法名
这里传入参数类型可以是自己定义的
举几个简单的例子:
这表示我定义了一个名为display的函数指针,它传入的参数类型是int,返回值类型也是int
std::function<int(int)> display;
这里我自己定义了一个student类型,然后将student1的传入参数设置为student类型
struct student
{
int age;
int name;
};
int main(){
std::function<int(student a)> student1;
return 0;
}
如下是一个基本的用法
#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等