lambda表达式、仿函数、函数对象

目录

一,lambda表达式

二,lambda表达式各部分用法

1,[]

2,->

三,lambda表达式的类型

1,函数返回lambda表达式

2,lambda表达式返回lambda表达式

四,仿函数

五,函数对象、function


一,lambda表达式

lambda表达式相当于就是一个匿名函数。

使用示例:

#include<iostream>
#include <algorithm>
using namespace std;

int main()
{
	int x[]={4,6,2,5};
	sort(x,x+sizeof(x)/sizeof(int),[](int a,int b){return a>b;});
	for(int i=0;i<sizeof(x)/sizeof(int);i++)cout<<x[i]<<"  ";
	return 0;
}

其中,[](int a,int b){return a>b;}  就是一个lambda表达式,相当于仿函数 greater<int>()

二,lambda表达式各部分用法

1,[]

[]用来控制lambda表达式中可以使用哪些外部变量。

(1)&是引用所有变量

#include<iostream>
#include <algorithm>
using namespace std;

int main()
{
	int x[]={4,6,2,5},s=0;
	for_each(x,x+sizeof(x)/sizeof(int),[&](int x){s+=x;});
	cout<<s;
	return 0;
}

(2)=是按值传递所有变量

#include<iostream>
#include <algorithm>
using namespace std;

int main()
{
	int x[]={4,6,2,5},s=10;
	for_each(x,x+sizeof(x)/sizeof(int),[=](int x){cout<<s+x;});
	return 0;
}

(3)&和=可以组合使用

(4)this是引用所在类中的成员变量

#include<iostream>
#include <algorithm>
using namespace std;

class S{
private:
    int x[4],s;
public:
    S()
    {
        x[0]=2,x[1]=3,x[2]=5,x[3]=4;
        s=0;
    }
    void out()
    {
        for_each(x,x+sizeof(x)/sizeof(int),[this](int x){cout<<s+x;s+=10;});
    }
};

int main()
{
	S a;
	a.out();
	return 0;
}

不过,根据我的实测,无论成员变量是共有还是私有,无论[]中是this还是=还是&,效果都是一样的。

2,->

->用来控制lambda表达式的返回值类型,对于可以自动推导的返回值类型,这个可以省略。

如果没有return语句或者只有一个return语句,是肯定可以推导出来的,如果超过1个return语句,就看各个return的表达式的类型是否一致了。

#include<iostream>
using namespace std;

template <typename FUN>
void f(FUN func)
{
    cout<<func(1.2)<<" ";
}

int main()
{
    f([=](double x){return x;});
    f([=](double x)->int{return x;});
    return 0;
}

输出11.2 1

三,lambda表达式的类型

lambda表达式是全局唯一类型,2个内容相同的lambda表达式也是不同的类型。

1,函数返回lambda表达式

lambda表达式的类型很复杂,几乎写不出来,返回lambda表达式可以用auto

auto fun()
{
	return [](int a, int b) {
		return a + b;
	};
}

int main()
{
	auto p = fun();
	cout<<p(1, 2);
	return 0;
}

2,lambda表达式返回lambda表达式

int main()
{
	auto p = [](int a) {
		return [a](int b) {
			return a + b;
		};
	};
	auto p2 = p(5);
	cout << p2(3);
	return 0;
}

四,仿函数

在类中重载()运算符,使得一个类可以像一个函数一样使用,所以叫仿含,也叫类函数对象。

class cmp
{
public:
	bool operator()(int a, int b)
	{
		return a < b;
	}
};

int main()
{
	cmp c;
	int a = 1, b = 2;
	if (c(a, b))cout << 123;
	if (cmp()(a, b))cout << 123;
	return 0;
}

五,函数对象、function

C++有3种函数对象:函数、函数指针、仿函数(即类函数对象)

函数签名相同的函数对象可以视作同一种function对象。

bool sub(int a, int b) {
	return a - b;
}
class cmp
{
public:
	int operator()(int a, int b)
	{
		return a < b;
	}
};
int main()
{
	map<string, function<int(int, int)>>m;
	m["+"] = [](int a, int b) {
		return a + b;
	};
	m["-"] = sub;
	m["cmp"] = cmp();
	return 0;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值