IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++新特性12_ Lambda 表达式/匿名函数捕获列表[]及应用(for_each,stl中迭代写法,迭代器iterator) -> 正文阅读

[C++知识库]C++新特性12_ Lambda 表达式/匿名函数捕获列表[]及应用(for_each,stl中迭代写法,迭代器iterator)

捕获列表
所谓捕获列表,其实可以理解为参数的一种类型,lambda 表达式内部函数体在默认情况下是不能够使用函数体外部的变量的,这时候捕获列表可以起到传递外部数据的作用。 根据传递的行为,捕获列表也分为以下几种:
1. 值捕获
与参数传值类似,值捕获的前期是变量可以拷贝,不同之处则在于,被捕获的变量在 lambda 表达式被创建时拷贝,而非调用时才拷贝:


#include <iostream>
using namespace std;


int main() {
	
	int t = 10;

	//按值捕获,捕获的是声明匿名函数时,捕获列表参数的值
	 auto f=[t]() mutable{
		 cout << t << endl;
		 return t;
	};

	t = 11;

	f();

}

在这里插入图片描述
2. 引用捕获
与引用传参类似,引用捕获保存的是引用,值会发生变化。

#include <iostream>
using namespace std;

int main() {

	//按引用捕获
	int t = 10;
	//此处只是一个声明,还未调用
	auto f2 = [&t]() mutable {
		cout << t << endl;
		t = 13;
		return t;
	};

	t = 11;

	f2();

	cout << t << endl;

}

运行结果:
在这里插入图片描述
3. 隐式捕获
手动书写捕获列表有时候是非常复杂的,这种机械性的工作可以交给编译器来处理,这时候可以在捕获列表中写一个 &= 向编译器声明采用 引用捕获或者值捕获.
总结一下,捕获提供了 Lambda 表达式对外部值进行使用的功能,捕获列表的最常用的四种形式可以是:
(1)[] 空捕获列表;
(2)[name1, name2, …] 捕获一系列变量;
(3)[&] 引用捕获, 让编译器自行推导捕获列表;
(4)[=] 值捕获, 让编译器执行推导应用列表;

//捕获列表
	int a = 1;
	int b = 2;

	//按值捕获所有变量
	[=]() {
		cout << a << "+" << b << endl;
	}();

	//按引用捕获所有变量
	[&]() {
		cout << a++ << "+" << b++ << endl;
	}();

	//按值和引用捕获所有变量
	[a,&b]() {
		cout << a<< "+" << b<<endl;
	}();

4. Lambda 表达式的应用
利用stl中迭代写法for_each进行动态数组内元素奇偶数的判断。

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

//应用举例
int main()
{
	//常规方法
	//判断哪些是奇数,哪些是偶数
	vector<int>v = {1,2,3,4,5};
	for (int i=0;i<v.size();i++)
	{
		if (v[i] % 2 == 0)
		{
			cout << v[i] << "是偶数" << endl;

		}
		else {
			cout << v[i] << "是奇数" << endl;
		}
	}

	//高阶写法,for_each,stl中提供的迭代的写法
	//起始,结尾,每遍历一次执行的匿名函数
	//每一次调用就会将值传给n
	for_each(v.begin(), v.end(), [](int n) {
		if (n % 2 == 0)
		{
			cout << n << "是偶数" << endl;

		}
		else {
			cout << n << "是奇数" << endl;
		}
	});
	return 0;
	
	//未能实现,时间问题后期再研究
	//利用迭代器iterator进行遍历,并应用匿名函数
	//for (auto it : v)
	for (auto it = v.begin(); it != v.end(); it++)
	{
		[&](int n) {
			if (n % 2 == 0)
			{
				cout << n << "是偶数" << endl;

			}
			else {
				cout << n << "是奇数" << endl;
			}
		};
	}
	
}

迭代器:C++新特性03_迭代器iterator及类型推导auto
5.学习视频地址: Lambda 表达式/匿名函数捕获列表及应用
6.学习笔记:Lambda 表达式/匿名函数捕获列表及应用笔记

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-11-18 11:01:39  更:2021-11-18 11:02:03 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 7:59:33-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码