C++11标准下的lambda表达式相关的知识点汇总(尚可)

本文深入探讨了C++11中的Lambda表达式,从基础的函数定义到方法重载,再到Lambda的使用,包括值引用、捕获列表等。通过实例展示了如何使用Lambda简化代码,如在Qt中的应用,并解释了不同捕获方式的含义和用法。
摘要由CSDN通过智能技术生成

编译器:vs2017
时间:昨天
建议学习时长:40分
提升内容:基础知识
特别: 有一些代码注释请仔细阅读,说不定对学习有很大帮助,接下来!请白嫖吧!!!

//声明:本文代码参考b站用户 bili_57801776504视频讲解分析而成,原视频请移步bz观看。

      在此基础上,我增加了一些对lambda表达式的个人理解和书面知识汇总,供有缘人学习,如有不同观点或者个人想法,请在文章下评论,共同探讨,提升自己。

1.1 c++普通方法定义函数进行加法运算

#include <iostream>
using namespace std; //命名空间
class AddNum
{
public:
	AddNum(int num) : num_(num) {};
	int addNum(int x) const {
		return num_ + x;
	}
private:
	int num_;
};
int main()
{
	auto add_num = AddNum(10);
	auto x = add_num.addNum(5);
	cout << "x值为:" << x << endl;
	return 0;
}

1.1.1 使用方法重载加法运算符进行求和运算
 

#include <iostream>
using namespace std;

class AddNum
{
public:
	AddNum(int num) : num_(num) {};
	//int addNum(int x) const {
	//	return num_ + x;
	//}
	int operator()(int x) const {  //重载操作符函数
		return num_ + x;
	}
private:
	int num_;
};
int main()
{
	auto add_num = AddNum(10);
	//auto x = add_num.addNum(5);
	auto x = add_num(5);
	cout << "Lambda表达式中x值为:" << x << endl;
	return 0;
}

1.1.2 使用lambda表达式进行求和运算  用一行代码代替AddNum

//中间有1.1.1的代码内容 看注释     在 //Lmabda  找到表达式开始的位置


#include <iostream>
using namespace std;

class AddNum
{
public:
	AddNum(int num) : num_(num) {};
	//int addNum(int x) const {
	//	return num_ + x;
	//}
	int operator()(int x) const {
		return num_ + x;
	}
private:
	int num_;
};


int main()
{
	// functor
	auto add_num = AddNum(10);
	//auto x = add_num.addNum(5);
	auto x = add_num(5);
	cout << "方法重载加法运算符的x值为:" << x << endl;

	//Lmabda
	//编译器自动推断函数
	//小括号 (参数列表){函数体}
	auto add_num2 = [lambda_num = 10](int x){  //c++14 在lmabda表达式中定义未定义的变量,要求对该变量赋初值,并且不使用类型说明符,或者auto
		return lambda_num + x;  //函数体作用域仅限于Lmabda表达式 即当前处在的第一对最内层的{}中 
	};
	auto lambda_x = add_num2(5);
	cout << "Lambda表达式中x值为:" << lambda_x << endl;

	return 0;
}

2.1 lmbda表达式 值引用的几种方法

#include <iostream>
using namespace std;

int main()
{
	int ret = [](int x) {   //该表达式只能在该处使用 
		return ++x;
	}(3);

	cout << "ret:" << ret << endl;
	return 0;
}

2.1.1 要使用该表达式 可以使用function函数修饰存储

#include <iostream>

//std::function需要此头文件
#include <functional>  //使用function函数需要添加该头文件

int main()
{
	// std::function<int(int)> 
	auto func = [](int x){   //->int可以省略  c++11中auto 自动推导函数返回类型
		return ++x;
	};
	func(1);

	for (int  i = 0; i < 10; i++)
	{
	  std::cout <<  func(i) << std::endl;
	}
	return 0;
}

2.1.2 使用for_each 打印数组中的5个整数 与lmbda表达式

#include <iostream>
#include <algorithm>  //for_each 
#include <vector>

using namespace std;
void print_arr(int x) {
	cout << "x:" << x << endl;
}
int main()
{
	//打印5个整数的值
	vector<int> arr = {1,3,4,5,7};
	for_each(arr.begin(), arr.end(), print_arr);
	return 0;
}

2.1.3 也可以定义一个结构体函数  方法重载operator

#include <iostream>
#include <algorithm>  //for_each 
#include <vector>

using namespace std;
//void print_arr(int x) {
//	cout << "x:" << x << endl;
//}
struct printArr
{
	void operator()(int x) {
		cout << "x:" << x << endl;
	}
}print_arr;

int main()
{
	//打印5个整数的值
	vector<int> arr = {1,3,4,5,7};
	for_each(arr.begin(), arr.end(), print_arr);
	return 0;
}

2.2.1 使用lmbda表达式代替该函数

#include <iostream>
#include <algorithm>  //for_each 
#include <vector>

using namespace std;

int main()
{
    //打印5个整数的值
    vector<int> arr = {1,3,4,5,7};
    for_each(arr.begin(), arr.end(), [](int x) {
        cout << "lmabda表达式中x:" << x << endl;
    });
    return 0;
}

2.2.2 捕获列表lambda表达式 将表达式之外的值,变量->调用到表达式函数体里面使用

#include <iostream>
#include <algorithm>  //for_each 
#include <vector>

using namespace std;

int main()
{
	//打印5个整数的值
	int multiplier = 3;
	vector<int> arr = {1,3,4,5,7};
	for_each(arr.begin(), arr.end(), [multiplier](int x) { 
                                   //按值捕获  [=]换成 = 外部所有变量都拿来
                                   //按引用捕获[&[multiplier]] 只引用该变量
                                   //全部引用  [&] 引用外部所有变量   
                                   //补充 [=,&x] x以引用的方式捕获,其余外部变量以传值的方式捕获
                                   //     [&,x] x以传值的方式捕获,其余外部变量则以传引用的方式捕获
                                   //     [x,&y]x以传值的方式捕获,y以传引用的方式捕获
                                   //     []不捕获任何外部变量

                multiplier++;//引用时才可以修改该变量的值
		cout << "lmabda表达式中x*multiplier=" << x * multiplier << endl;
	});
	return 0;
}

3.1.1 关于Qt 中lambda表达式的使用

引入符

说明

[]

不捕获任何外部变量

[=]

以传值的方式捕获所有的外部变量

[&]

以传引用的方式捕获所有外部变量

[x,&y]

x以传值的方式捕获,y以传引用的方式捕获

[=,&x]

x以引用的方式捕获,其余外部变量以传值的方式捕获

[&,x]

x以传值的方式捕获,其余外部变量则以传引用的方式捕获

   由于在Qt5中拥有最新的信号与槽语法使用方法,而在Qt4基础上提高了信号与槽的灵活性,允许使用任意函数作为槽函数。

但如果想更好地执行异步代码,连函数名都不想定义,及其简单的一种定义函数的方法,可直接在Qt信号与槽中进行编写函数体。可通过Lambda表达式达到这个目的。而Lambda表达式是C++11新增加的特性之一。

[this]表示值传递方式捕获当前的this指针

connect(信号发出者, &信号, [this]() {

 函数体;

});

[x,y]表示值传递方式捕获x,y

connect(发出者, 信号类型, [x, y, z]() {
			类名::方法引用()->槽函数(传值);
}

捕获列表不允许变量重复传递,如[=,a]则以传值方式捕获所有变量,又重复捕获a,会报错。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序小白Erike.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值