概述:关于函数指针与lambda表达式
文章目录
函数指针
函数指针,将函数赋值给一个变量
函数指针代表函数所处的内存地址
auto关键字对于函数指针之类的东西非常非常有用
基本使用
#include <iostream>
void HelloWorld(int a){
std::cout << "Hello World:" << a << std::endl;
}
int main()
{
//三者一致
//1
typedef void(*HelloWorldFunction)(int) ;
HelloWorldFunction function = Helloworld;
//2
void(*function)(int) = HelloWorld;//function函数名
//3
auto function = HelloWorld;//获取函数指针
function(5);
std::cin.get();
}
回调
#include<iostream>
#include <vector>
void PrintValue(int value){
std::cout <<"Value:"<<value <<std:endl;
}
void ForEach(const std:vector<int>&values, void(*func)(int))
{
for (int value : values)
func(value);
}
int main()
{
std:vector<int>values ={1,5,4,2,3 };
ForEach(values,PrintValue);
std:cin.get();
}
关于lambda表达式
lambda就是普通函数,在过程中生成,用完即弃
需要用函数指针的地方都可以用lambda
#include<iostream>
#include <vector>
void ForEach(const std:vector<int>&values, void(*func)(int))
{
for (int value : values)
func(value);
}
int main()
{
std:vector<int>values ={1,5,4,2,3 };
//ForEach(values,[](int value){ std::cout <<"Value:"<<value <<std:endl; });
auto lambda =[](int value){std::cout <<"Value:"<<value <<std::endl;}
ForEach(values,lambda);
std:cin.get();
}
[captures](){ /*函数体; */ }
captures : 可以捕获0或多个变量
[a, &b]: a 以复制的方式捕获,b 以引用的方式捕获
[&] : 以引用的方式捕获所有
[=] : 以值或者复制的方式传递
[] : 什么都不捕获
捕获表达式范围以外的变量
//注意使用capture后,在要使用该lambda表达式作函数指针时,对应改为
std::function<void(int)>& func 其中func是自定义函数名,void是返回值,int是参数列表
#include<iostream>
#include <vector>
#include <function>
void ForEach(const std:vector<int>&values, const std::function<void(int)>& func)
{
for (int value : values)
func(value);
}
int main()
{
std:vector<int>values ={1,5,4,2,3 };
int a = 5;
//1
auto lambda =[a](int value){std::cout <<"Value:"<<value <<std::endl;}
//2
auto lambda =[&a](int value){std::cout <<"Value:"<<value <<std::endl;}
//3
auto lambda =[=](int value){std::cout <<"Value:"<<value <<std::endl;}
//4
auto lambda =[&](int value){std::cout <<"Value:"<<value <<std::endl;}
ForEach(values,lambda);
std:cin.get();
}
mutable使用
#include<iostream>
#include <vector>
#include <function>
void ForEach(const std:vector<int>&values, const std::function<void(int)>& func)
{
for (int value : values)
func(value);
}
int main()
{
std:vector<int>values ={1,5,4,2,3 };
int a = 5;
auto lambda =[a](int value) mutable {
a= 5;//在函数体内想改变capture进来的值,需要加mutable否则报错
std::cout <<"Value:"<<value <<std::endl;
}
ForEach(values,lambda);
std:cin.get();
}
另一种使用lambda表达式的场景
#include<iostream>
#include <vector>
#include <function>
#include <algorithm>
void ForEach(const std:vector<int>&values, const std::function<void(int)>& func)
{
for (int value : values)
func(value);
}
int main()
{
std::vector<int>values ={1,5,4,2,3 };
//接受迭代器,起始位置 和终止位置,返回符合条件的迭代器位置
auto it = std::find_if(values.begin(),value.end(),[](int value){return value>3;});//找第一个大于3的数
//此时返回的*it == 5
int a = 5;
auto lambda =[a](int value) mutable {
a= 5;//在函数体内想改变capture进来的值,需要加mutable否则报错
std::cout <<"Value:"<<value <<std::endl;
}
ForEach(values,lambda);
std:cin.get();
}
注释:
上述资料为个人学习总结笔记