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

news2024/12/29 8:46:04

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

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

文章目录

  • 第18 章探讨 C++新标准.新的类功能.比较函数指针、函数符和 Lambda 函数
  • 18.4 Lambda 函数
  • 18.4.1 比较函数指针、函数符和 Lambda 函数
  • 程序清单18.4 lambda0.cpp


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){}
	bool operator()(intx){returnxdv==0};
}

这为何可行呢?因为可使用构造函数创建存储特定整数值的fmod对象:

f_mod obj(3);//f mod.dv set to 3

而这个对象可使用方法 operator()来返回一个 bool 值:

bool is div by3=obj(7);// same as obj.operator()(7)

构造函数本身可用作诸如countif()等函数的参数:

count3 = std::count if(numbers.begin(),numbers.end(),f mod(3));

参数fmod(3)创建一个对象,它存储了值3:而count_if()使用该对象来调用operator()(),并将参数x设置为numbers 的一个元素。要计算有多少个数字可被13(而不是 3)整除,只需将第三个参数设置为f mod(3)。
最后,来看看使用 lambda的情况。名称lambda来自lambda calculus(λ演算)—种定义和应用函数的数学系统。这个系统让您能够使用匿名函数–即无需给函数命名。在C++11中,对于接受函数指针或函数符的函数,可使用匿名函数定义(lambda)作为其参数。与前述函数3()对应的lambda如下:

[](int x){return x%3 == 0;}

这与 B()的函数定义很像:

bool f3(intx)return x%3==0;

差别有两个:使用几替代了函数名(这就是名的由来);没有声明返回类型。返回类型相当于使用decltyp 根据返回值推断得到的,这里为 bool。如果lambda不包含返回语句,推断出的返回类型将为 void。就这个示例而言,您将以如下方式使用该lambda:

count3 = std::count_if(numbers.begin(),numbers .end()
[](int x){return x号3 == 0;});

也就是说,使用使用整个lambad表达式替换函数指针或函数符构造函数。仅当lambad 表达式完全由一条返回语句组成时,自动类型推断才管用:否则,需要使用新增的返回类型后置语法:

[](double x)->double{int y=x;return x-y;) // return type is double

程序清单18.4演示了前面讨论的各个要点。

程序清单18.4 lambda0.cpp

// lambda0.cpp -- using lambda expressions
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
#include <ctime>
const long Size1 = 39L;
const long Size2 = 100*Size1;
const long Size3 = 100*Size2;

bool f3(int x) {return x % 3 == 0;}
bool f13(int x) {return x % 13 == 0;}

int main()
{
    using std::cout;
    std::vector<int> numbers(Size1);

    std::srand(std::time(0));
    std::generate(numbers.begin(), numbers.end(), std::rand);

// using function pointers
    cout << "Sample size = " << Size1 << '\n';

    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 by 13: " << count13 << "\n\n";

// increase number of numbers
    numbers.resize(Size2);
    std::generate(numbers.begin(), numbers.end(), std::rand);
    cout << "Sample size = " << Size2 << '\n';
// using a functor
    class f_mod
    {
    private:
        int dv;
    public:
        f_mod(int d = 1) : dv(d) {}
        bool operator()(int x) {return x % dv == 0;}
    };

    count3 = std::count_if(numbers.begin(), numbers.end(), f_mod(3));
    cout << "Count of numbers divisible by 3: " << count3 << '\n';
    count13 = std::count_if(numbers.begin(), numbers.end(), f_mod(13));
    cout << "Count of numbers divisible by 13: " << count13 << "\n\n";

// increase number of numbers again
    numbers.resize(Size3);
    std::generate(numbers.begin(), numbers.end(), std::rand);
    cout << "Sample size = " << Size3 << '\n';
// using lambdas
    count3 = std::count_if(numbers.begin(), numbers.end(),
             [](int x){return x % 3 == 0;});
    cout << "Count of numbers divisible by 3: " << count3 << '\n';
    count13 = std::count_if(numbers.begin(), numbers.end(),
              [](int x){return x % 13 == 0;});
    cout << "Count of numbers divisible by 13: " << count13 << '\n';

    // std::cin.get();
    return 0;
}

在这里插入图片描述
输出表明,样本很小时,得到的统计数据并不可靠。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2049137.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python爬虫入门教程(非常详细)适合零基础小白

一、什么是爬虫&#xff1f; 1.简单介绍爬虫 爬虫的全称为网络爬虫&#xff0c;简称爬虫&#xff0c;别名有网络机器人&#xff0c;网络蜘蛛等等。 网络爬虫是一种自动获取网页内容的程序&#xff0c;为搜索引擎提供了重要的数据支撑。搜索引擎通过网络爬虫技术&#xff0c;将…

为什么穷大方

为什么有些人明明很穷&#xff0c;却非常的大方呢&#xff1f; 因为他们认知太低&#xff0c;根本不懂钱的重要性&#xff0c;总是想着及时享乐&#xff0c;所以一年到头也存不了什么钱。等到家人孩子需要用钱的时候&#xff0c;什么也拿不出来&#xff0c;还到处去求人。 而真…

电子电气架构 --- 车载以太网

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节…

DOM破坏及其实战案例

目录 DOM靶场&#xff1a; 第六关&#xff1a; 第七关&#xff1a; 第八关&#xff1a; DOM破坏&#xff1a; dom破坏案例1&#xff1a; 案例二&#xff1a; DOM靶场&#xff1a; DOM靶场平台&#xff1a;Challenges 前五关请查看&#xff1a;DOM型xss靶场实验_domx…

如何使用天地图

第一步&#xff1a;登录/注册 国家地理信息公共服务平台 第二步&#xff1a;获取服务许可&#xff08;Key&#xff09; 如果你已经申请了许可&#xff0c;那可以不用看上的了&#xff0c;如何使用请看下面 1.首先在index.html中一下代码 <script src"http://api.tian…

creo曲面建模1

偏移平面&#xff1a; 在偏移面做一个圆&#xff1a; 在阿基米德曲线上&#xff0c;将曲线四等分。点在曲线上并且在相交基准面上&#xff1a; 绘制曲线&#xff1a; 第二段&#xff1a; 第三段&#xff1a; 第四段4.5高&#xff1a; 曲线复合&#xff1a; 边界混合&a…

2024下半年软考备考全攻略:科目选择与高效学习策略

随着2024年下半年的脚步日益临近&#xff0c;软考&#xff08;软件水平考试&#xff09;的考生们也开始紧锣密鼓地准备起来。今年&#xff0c;软考官方对考试科目进行了重大调整&#xff0c;为考生们提供了更加多样化的选择。以下是详细的考试信息、科目调整以及针对不同考生群…

铁电存储器(FM24W256)I2C读写驱动(1):FM24W256简介

0 参考资料 FM24W256&#xff08;Cypress公司生产&#xff09;数据手册 1 FM24W256铁电存储器简介 铁电存储器&#xff08;FRAM&#xff09;相比带电可擦可编程只读存储器&#xff08;EEPROM&#xff09;最突出的两个优势就是 拥有几乎无限的读写次数和写入不需要等待&#xf…

打卡学习Python爬虫第二天|Requests的使用

一、什么是requests库&#xff1f; requests库是一个非常流行和强大的HTTP库&#xff0c;它用于在Python中发送HTTP请求。这个库的主要特点是其简洁和易于使用的API&#xff0c;使得发送网络请求和获取响应变得非常简单。 以下是requests库的一些关键特点和使用方法&#xff…

四年的功能测试,在这个金九银十的招聘旺季找不到工作怎么办?

昨天周日跟一个读者聊了很久&#xff0c;今天跟大家聊一下他的故事。 他做了4年的功能测试了&#xff0c;最近因为种种原因换工作&#xff0c;结果从8月底到现在快两个月了&#xff0c;面试了十几二十家&#xff0c;收到的offer都不是自己很满意的&#xff0c;很是懊恼&#x…

C语言相关

1. 代码执行过程 1.1 简述编译运行一段代码的过程 1.1.1 预处理 为了接下来能够解释的更加清楚&#xff0c;使用linux 平台下的 gcc 编译器解释。先书写一个非常简单的程序来介绍&#xff1a; 第一步发生的是预编译&#xff0c;使用-E 指令会使程序只进行到预编译指令。经过…

html+css+js 黑神话悟空网页设计与制作

htmlcssjs 黑神话悟空网页设计与制作 网站介绍 1、网站程序&#xff1a;主要使用网页三剑客htmlcssjavaScript实现网页设计与制作&#xff0c;完成网站的功能设计。制作适用于任何浏览器或设备的精美网站。 2、网站素材&#xff1a;搜集或制作适合网页风格和尺寸的图片&#…

Vmware WorkStations 17 ,centos 安装 vmware tools

1.Vmware WorkStations 17 ,安装vmware tools 按钮显示灰色,需重新下载下载vmware tools https://softwareupdate.vmware.com/cds/vmw-desktop/ws/ 根据自身的vmware workstation 版本选择 选择Windows 选择packages 2.搜索Centos8 自带vmware tools ****.iso文件 3.将ISO文…

我主编的电子技术实验手册(16)——认识电容

本专栏是笔者主编教材&#xff08;图0所示&#xff09;的电子版&#xff0c;依托简易的元器件和仪表安排了30多个实验&#xff0c;主要面向经费不太充足的中高职院校。每个实验都安排了必不可少的【预习知识】&#xff0c;精心设计的【实验步骤】&#xff0c;全面丰富的【思考习…

如何利用TRIZ创新思维进行产品的市场需求分析?

实践证明&#xff0c;传统的市场调研方法往往难以触及那些未被言说的“隐性需求”。而今&#xff0c;借助TRIZ&#xff08;发明问题解决理论&#xff09;这一强大的创新思维工具&#xff0c;我们不仅能洞悉市场的显性需求&#xff0c;更能解锁隐藏在背后的无限商机。本文&#…

【排序篇】插入排序与选择排序

&#x1f308;个人主页&#xff1a;Yui_ &#x1f308;Linux专栏&#xff1a;Linux &#x1f308;C语言笔记专栏&#xff1a;C语言笔记 &#x1f308;数据结构专栏&#xff1a;数据结构 文章目录 1. 排序的概念及其应用1.1 排序的概念1.2 排序的应用场景1.3 常见的排序算法 2.常…

Diffusion Model相关论文解析之(一)Denoising Diffusion Probabilistic Models

目录 1、摘要2、创新点3、主要公式4、主要实现过程 1、摘要 ‌Denoising Diffusion Probabilistic Models (DDPMs) 是一种基于参数化的马尔可夫链的模型&#xff0c;它使用变分推理进行训练&#xff0c;以在有限时间内生成与数据匹配的样本。‌ 这种模型通过逆扩散过程逐渐向样…

Unity开发抖音小游戏广告部分接入

Unity开发抖音小游戏广告部分接入 介绍环境确保开通流量主获取广告位广告部分代码测试如下总结 介绍 最近在使用Unity做抖音小游戏这块的内容&#xff0c;因为要接入广告&#xff0c;所以这里我把我接入广告的部分代码和经验分享一下。 环境确保 根据抖音官方的文档我们是先…

day 28 HTTP协议

一、TCP粘包问题 TCP发送数据是连续的&#xff0c;两次发送的数据可能粘连成一包被接收到 解决粘包问题方法&#xff1a; 1.接收指定长度&#xff1a;&#xff08;不稳定&#xff09; 2.睡眠&#xff1a;&#xff08;效率低&#xff09; 让每次…

浦发银行上半年增利不增收,新领导能否重夺“对公之王”标签?

去年9月8日&#xff0c;浦发银行原董事长郑杨、原行长潘卫东双双辞职。今年2月&#xff0c;国家金融监督管理总局核准张为忠为浦发银行董事、董事长的任职资格&#xff0c;并于3月核准康杰副行长的任职资格。而行长一职&#xff0c;悬空已久&#xff0c;历经10个月有了新的进展…