第18 章探讨 C++新标准.新的类功能.比较函数指针、函数符和 Lambda 函数

第18 章探讨 C++新标准.新的类功能.比较函数指针、函数符和 Lambda 函数

第18 章探讨 C++新标准.新的类功能.比较函数指针、函数符和 Lambda 函数


18.4 Lambda 函数

见到术语 lambda函数(也叫 lambda表达式,常简称为lambda)时,您可能怀疑 C++11添加这项新功能旨在帮助编程新手。看到下面的lambda函数示例后,您可能坚定了自己的怀疑:&countcount+=(x号13==0);
但 lambda 函数并不像看起来那么晦涩难懂,它们提供了一种有用的服务,对使用函数谓词的 STL 算法来说尤其如此。

18.4.1 比较函数指针、函数符和 Lambda 函数

来看一个示例,它使用三种方法给 STL算法传递信息:函数指针、函数符和lambda。出于方便的考虑,将这三种形式通称为函数对象,以免不断地重复“函数指针、函数符或 lambda”。假设您要生成一个随机整数列表,并判断其中多少个整数可被3整除,多个少整数可被13 整除。
生成这样的列表很简单。一种方案是,使用vector存储数字,并使用STL算法 generate()在其中填充随机数:

#include <vector>
#include <algorithm>
#include <cmath>
...
std::vector<int>numbers(1000);
std::generate(vector.begin(),vector.end(),std::rand);

函数 generate()接受一个区间(由前两个参数指定),并将每个元素设置为第三个参数返回的值,而第三个参数是一个不接受任何参数的函数对象。在上述示例中,该函数对象是一个指向标准函数rand()的指针。
通过使用算法 count _i(),很容易计算出有多少个元素可被3整除。与函数generate()一样,前两个参数应指定区间,而第三个参数应是一个返回true或false的函数对象。函数 count if )计算这样的元素数,即它使得指定的函数对象返回true。为判断元素能否被3整除,可使用下面的函数定义:bool f3(int x)returnx号3==0;
同样,为判断元素能否被13整除,可使用下面的函数定义:

bool f13(int x)return x % 13 ==0;

定义上述函数后,便可计算复合条件的元素数了,如下所示:

int count3=std::count if(numbers.begin(),numbers.end(),f3);cout << "Count of numbers divisible by 3:<<count3 << n';int count13=std::count if(numbers.begin(),numbers.end(),f13);cout << "Count of numbers divisible by13:"<< count13 << "nn";

下面复习一下如何使用函数符来完成这个任务。第16章介绍过,函数符是一个类对象,并非只能像函数名那样使用它,这要归功于类方法operator()()。就这个示例而言,函数符的优点之一是,可使用同一个函数符来完成这两项计数任务。下面是一种可能的定义:
下面复习一下如何使用函数符来完成这个任务。第16章介绍过,函数符是一个类对象,并非只能像函数名那样使用它,这要归功于类方法 operator()()。就这个示例而言,函数符的优点之一是,可使用同一个函数符来完成这两项计数任务。下面是一种可能的定义:

class f_mod

{
   
private:
	int dv;
public :
	f_mod(int d=1):dv(d
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值