函数指针与lambda表达式

概述:关于函数指针与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();
}

注释:

上述资料为个人学习总结笔记

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值