C++ Primer 5th笔记(chap 14 重载运算和类型转换)lambda函数对象

本文主要是介绍C++ Primer 5th笔记(chap 14 重载运算和类型转换)lambda函数对象,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. 定义

lambda是函数对象:编写一个lambda后,编译器会将该表达式转换成一个未命名类的未命名对象,类中含有一个重载的函数调用运算符。

eg.

stable_sort(words.begin(),words.end(),[](const string &a,const string &b)
{return a.size() < b.size();});//等价于下面的类:
class ShorterString{
public:bool operator()(const string &a,const string &b){return a.size() < b.size();}
};
stable_sort(words.begin(),words.end(),ShorterString());

测试代码:

std::vector<string> words = { "a31", "b1" };
stable_sort(words.begin(), words.end(), [](const string& a, const string& b){return a.size() < b.size(); });    
for_each(words.begin(), words.end(), [](const string& s){std::cout << s << endl; });std::vector<string> words2 = { "a31", "b1" };
stable_sort(words2.begin(), words2.end(), ShorterString());
for_each(words2.begin(), words2.end(), [](const string& s){std::cout << s << endl; });

输出结果为

b1
a31
b1
a31

2. 表示 lambda 及相应捕获行为的类

lambda产生的类必须为每个值捕获的变量建立对应的数据成员,同时创建构造函数。

eg.

auto wc = find_if(words.begin(),words.end(),[sz](const string &a){return a.size() > = sz;})//该 lambda 表达式产生的类将形如:
class SizeComp
{SizeComp(size_t n):sz(n) { }bool operator()(const string &s)const {return s.size() >= sz;}
private:size_t sz;
}; 

测试代码:

void lambda_functionObject_test2(vector<string>::size_type sz)    { std::vector<string> words = { "a31", "b1" };auto wc = find_if(words.begin(), words.end(), [sz](const string& a){return a.size() >= sz; });std::cout << *wc << endl;auto wc2 = find_if(words.begin(), words.end(), SizeComp(sz));std::cout << *wc2 << endl;
}
lambda_functionObject_test2(3);

输出结果:

a31
a31

3. 特性

  • lambda默认不能改变它捕获的变量。在默认情况下,由lambda产生的类中的函数调用运算符是一个const成员函数。如果lambda被声明为可变的,则调用运算符就不再是const函数了。
  • 通过引用捕获变量时,由程序负责确保lambda执行时该引用所绑定的对象确实存在。因此编译器可以直接使用该引用而无须在lambda产生的类中将其存储为数据成员。
  • .通过值捕获的变量被拷贝到lambda中,此时lambda产生的类必须为每个值捕获的变量建立对应的数据成员,并创建构造函数,用捕获变量的值来初始化数据成员。
  • .lambda产生的类不包含默认构造函数、赋值运算符和默认析构函数,它是否包含默认拷贝/移动构造函数则通常要视捕获的变量类型而定。

【引用】

[1] 代码functionObject.h

这篇关于C++ Primer 5th笔记(chap 14 重载运算和类型转换)lambda函数对象的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/855320

相关文章

MySQL中COALESCE函数示例详解

《MySQL中COALESCE函数示例详解》COALESCE是一个功能强大且常用的SQL函数,主要用来处理NULL值和实现灵活的值选择策略,能够使查询逻辑更清晰、简洁,:本文主要介绍MySQL中C... 目录语法示例1. 替换 NULL 值2. 用于字段默认值3. 多列优先级4. 结合聚合函数注意事项总结C

Java实现将byte[]转换为File对象

《Java实现将byte[]转换为File对象》这篇文章将通过一个简单的例子为大家演示Java如何实现byte[]转换为File对象,并将其上传到外部服务器,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言1. 问题背景2. 环境准备3. 实现步骤3.1 从 URL 获取图片字节数据3.2 将字节数组

Win32下C++实现快速获取硬盘分区信息

《Win32下C++实现快速获取硬盘分区信息》这篇文章主要为大家详细介绍了Win32下C++如何实现快速获取硬盘分区信息,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 实现代码CDiskDriveUtils.h#pragma once #include <wtypesbase

Javascript访问Promise对象返回值的操作方法

《Javascript访问Promise对象返回值的操作方法》这篇文章介绍了如何在JavaScript中使用Promise对象来处理异步操作,通过使用fetch()方法和Promise对象,我们可以从... 目录在Javascript中,什么是Promise1- then() 链式操作2- 在之后的代码中使

MyBatis的配置对象Configuration作用及说明

《MyBatis的配置对象Configuration作用及说明》MyBatis的Configuration对象是MyBatis的核心配置对象,它包含了MyBatis运行时所需的几乎所有配置信息,这个对... 目录MyBATis配置对象Configuration作用Configuration 对象的主要作用C

C++ Primer 标准库vector示例详解

《C++Primer标准库vector示例详解》该文章主要介绍了C++标准库中的vector类型,包括其定义、初始化、成员函数以及常见操作,文章详细解释了如何使用vector来存储和操作对象集合,... 目录3.3标准库Vector定义和初始化vector对象通列表初始化vector对象创建指定数量的元素值

Java8需要知道的4个函数式接口简单教程

《Java8需要知道的4个函数式接口简单教程》:本文主要介绍Java8中引入的函数式接口,包括Consumer、Supplier、Predicate和Function,以及它们的用法和特点,文中... 目录什么是函数是接口?Consumer接口定义核心特点注意事项常见用法1.基本用法2.结合andThen链

SpringBoot实现导出复杂对象到Excel文件

《SpringBoot实现导出复杂对象到Excel文件》这篇文章主要为大家详细介绍了如何使用Hutool和EasyExcel两种方式来实现在SpringBoot项目中导出复杂对象到Excel文件,需要... 在Spring Boot项目中导出复杂对象到Excel文件,可以利用Hutool或EasyExcel

Springboot控制反转与Bean对象的方法

《Springboot控制反转与Bean对象的方法》文章介绍了SpringBoot中的控制反转(IoC)概念,描述了IoC容器如何管理Bean的生命周期和依赖关系,它详细讲解了Bean的注册过程,包括... 目录1 控制反转1.1 什么是控制反转1.2 SpringBoot中的控制反转2 Ioc容器对Bea

MySQL 日期时间格式化函数 DATE_FORMAT() 的使用示例详解

《MySQL日期时间格式化函数DATE_FORMAT()的使用示例详解》`DATE_FORMAT()`是MySQL中用于格式化日期时间的函数,本文详细介绍了其语法、格式化字符串的含义以及常见日期... 目录一、DATE_FORMAT()语法二、格式化字符串详解三、常见日期时间格式组合四、业务场景五、总结一、