c++ function使用
一、function介绍
funciotn是从c++11开始支持的特性,使用它需要包含<functional>头文件
在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等