【C++函数的进化】函数指针,模板,仿函数,lambda表达式

/*** @poject          * @author			jUicE_g2R(qq:3406291309)* @file            C++函数的进化* * @language        C++* @EDA				Base on VS2022* @editor			Obsidian(黑曜石笔记软件)* * @copyright		2023* @COPYRIGHT	    原创学习笔记:转载需获得博主本人同意,且需标明转载源*/
  • 函数进化()
    函数 -> 函数指针 -> 函数模板 -> 仿函数->lambda表达式

文章目录

  • 1 函数
  • 2 函数指针
  • 3 函数模板
  • 4 仿函数(函数对象)
  • 5 lambda表达式简化

1 函数

#include <iostream>
using std::cin;
using std::cout;
using std::string;
typedef int* pInt;int Count_Match20_Elem(pInt pSta, pInt pEnd) {int res = 0;for (; pSta != pEnd; ++pSta)if (*pSta > 20)res++;return res;
}
int Count_Match25_Elem(const pInt pSta, const pInt pEnd) { // 这样会造成代码冗余int res = 0;for (; pSta != pEnd; ++pSta)if (*pSta > 25)res++;return res;
}int main(int* argc, char* argv[]){int arr[] = { 11,16,21,19,17,30 };cout << Count_Match20_Elem(arr, arr + sizeof(arr) / 4);	// sizeof(arr):得到的是arr数组的 总字节大小 ,而不是arr中元素的个数(一个int元素占4bit)return 0;
}

2 函数指针

  • 函数 变成 变量
  • “行为” “数据化”
#include <iostream>
using std::cin;
using std::cout;
using std::string;//将判断处的代码(独特之处)重新封装为函数
bool isGreater20(const int& val) { return val > 20; }
bool isGreater25(const int& val) { return val > 25; }
int CountMatchElem(int* pSta, int* pEnd, bool(*pComp)(const int&)) {int res = 0;for (; pSta != pEnd; ++pSta)if (pComp(*pSta))	//pComp为函数指针;括号里的传入参数为 指针变量pSta指向的对象res++;return res;
}int main(int* argc, char* argv[]){int arr[] = { 11,16,21,19,17,30 };cout << CountMatchElem(arr, arr + sizeof(arr)/ sizeof(int), isGreater20);return 0;
}

3 函数模板

  • 独立于类型的函数
  • 可产生函数特定类型的版本
#include <iostream>
using std::cin;
using std::cout;
using std::string;bool isGreater20(const int& val) { return val > 20; }
bool isGreater25(const int& val) { return val > 25; }
bool isTinyStr(const string& str) { return str.size() <= 3; }
template<typename DataType>
int CountMatchElem(DataType* pSta, DataType* pEnd, bool(*pComp)(const DataType&)) {int res = 0;for (; pSta != pEnd; ++pSta)if (pComp(*pSta))	//pComp为函数指针;括号里的传入参数为 指针变量pSta指向的对象res++;return res;
}
int main(int* argc, char* argv[]){int arr[] = { 11,16,21,19,17,30 };string strs[] = { "abc", "bcde", "cdefg", "de", "efg" };cout << CountMatchElem<int>(arr, arr + sizeof(arr)/ sizeof(int), isGreater20);cout << CountMatchElem<string>(strs, strs + sizeof(strs) / sizeof(strs[0]), isTinyStr);return 0;
}

4 仿函数(函数对象)

  • 定义了调用操作符
  • 行为类似函数的对象
#include <iostream>
using std::cin;
using std::cout;
using std::string;template<typename T>
struct Greater { // 定义仿函数T StdVal;explicit Greater(T val) : StdVal(val) {} // 构造函数初始化StdValbool operator()(const T& val) const { return val > StdVal; } // 重载函数调用操作符
};template<typename DataType>
int CountMatchElem(DataType* pSta, DataType* pEnd, bool(*pComp)(const DataType&)) {int res = 0;for (; pSta != pEnd; ++pSta)if (pComp(*pSta))	//pComp为函数指针;括号里的传入参数为 指针变量pSta指向的对象res++;return res;
}int main(int* argc, char* argv[]){int arr[] = { 11,16,21,19,17,30 };Greater<int> gtr20(20); // 实例化一个函数对象,将判断阈值设为20cout << CountMatchElem(arr, arr + sizeof(arr) / sizeof(int), gtr20); // 这里会报错!!!return 0;
}
  • 更改
template<typename DataType, typename pFunc>
int CountMatchElem(DataType* pSta, DataType* pEnd, pFunc pComp) 

5 lambda表达式简化

#include <iostream>
using std::cin;
using std::cout;
using std::string;template<typename DataType, typename pFunc>
int CountMatchElem(DataType* pSta, DataType* pEnd, pFunc pComp) {int res = 0;for (; pSta != pEnd; ++pSta)if (pComp(*pSta))	//pComp为函数指针;括号里的传入参数为 指针变量pSta指向的对象res++;return res;
}int main(int* argc, char* argv[]){int arr[] = { 11,16,21,19,17,30 };auto gtr20 = [](auto& val) -> bool {return val > 20; };cout << CountMatchElem(arr, arr + sizeof(arr) / sizeof(int), gtr20); // 这里会报错return 0;
}
  • 参考视频源【C++函数的进化 函数→函数指针→函数模板→仿函数|函数对象→lambda表达式】

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

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

相关文章

Unity Quaternion接口API的常用方法解析_unity基础开发教程

Quaternion接口的常用方法 Quaternion.Euler()Quaternion.Lerp()Quaternion.Inverse()Quaternion.RotateTowards() Quaternion在Unity中是一种非常重要的数据类型&#xff0c;用于表示3D空间中的旋转。Quaternion可以表示任何旋转&#xff0c;无论是在哪个轴上旋转多少度&#…

SQL Server如何建表

一、数据表的组成 实现完整性的约束有&#xff1a; –6个约束 –非空 not null –主键 primary key –唯一 unique –检查 check –默认 default –主键自增 identity 表约束 主键约束&#xff1a;值不能为null,且不能重复 非空约束&#xff1a;不能为null 默认约束&#xf…

【Python大数据笔记_day10_Hive调优及Hadoop进阶】

hive调优 hive官方配置url: Configuration Properties - Apache Hive - Apache Software Foundation hive命令和参数配置 hive参数配置的意义: 开发Hive应用/调优时&#xff0c;不可避免地需要设定Hive的参数。设定Hive的参数可以调优HQL代码的执行效率&#xff0c;或帮助定位问…

操作系统(存储管理进程管理设备管理)

文章目录 存储管理页式存储管理概念优点缺点页面置换算法快表&#xff08;很快速的页表&#xff09; 段式存储管理概念优点缺点 段页式存储管理概念优点缺点 进程管理概述作用特征功能分类计算机启动基本流程 进程管理进程的组成进程的基础状态前趋图进程资源图同步和互斥信号量…

使用Jupyter Notebook调试PySpark程序错误总结

项目场景&#xff1a; 在Ubuntu16.04 hadoop2.6.0 spark2.3.1环境下 简单调试一个PySpark程序&#xff0c;中间遇到的错误总结&#xff08;发现版对应和基础配置很重要&#xff09; 注意&#xff1a;在前提安装配置好 hadoop hive anaconda jupyternotebook spark zo…

【Spring总结】基于配置的方式来写Spring

本篇文章是对这两天所学的内容做一个总结&#xff0c;涵盖我这两天写的所有笔记&#xff1a; 【Spring】 Spring中的IoC&#xff08;控制反转&#xff09;【Spring】Spring中的DI&#xff08;依赖注入&#xff09;Dependence Import【Spring】bean的基础配置【Spring】bean的实…

web 渗透 信息搜集

一 收集域名信息 1.whois查询 whois&#xff08;读作“Who is”&#xff0c;非缩写&#xff09;&#xff0c;标准的互联网协议&#xff0c…

Django的可重用HTML模板示例

01-配置并运行Django项目 首先按照博文 https://blog.csdn.net/wenhao_ir/article/details/131166889配置并运行Django项目。 02-创建可重用模板文件 templates目录下新建目录common&#xff0c;然后在目录common下新建文件&#xff1a;navbar.html&#xff0c;并写入下面的…

高济健康:数字化科技创新与新零售碰撞 助推医疗产业优化升级

近日&#xff0c;第六届中国国际进口博览会在上海圆满落幕&#xff0c;首次亮相的高济健康作为一家专注大健康领域的疾病和健康管理公司&#xff0c;在本届进博会上向业内外展示了围绕“15分钟步行健康生活圈”构建进行的全域数字化升级成果。高济健康通过数字化科技创新与新零…

Linux下非root用户安装CUDA

目录 前言 参考链接 步骤 一. 首先&#xff0c;需要查看系统版本&#xff1a; 二. 安装包下载。 下载CUDA&#xff1a; cuDNN下载 三. 开始安装CUDA和cuDNN 安装CUDA 修改环境变量 安装 cuDNN 查看是否安装成功&#xff0c;输入nvcc -V 前言 由于一些代码实现&…

手动编译GDB

手动编译GDB 起因在于使用Clang-14编译C文件并生成调试信息,使用gdb调试时报DWARF相关错误。经检查原因在于虚拟机为Ubuntu 20.04&#xff0c;使用apt下载时官方提供gdb版本为9.2&#xff0c;不支持DWARF5,而Clang-14生成的调试信息是DWARF5版本的。为解决该问题&#xff0c;手…

Vue3-ref、reactive函数的watch

Vue3-ref、reactive函数的watch ref函数的watch 原理&#xff1a;监视某个属性的变化。当被监视的属性一旦发生改变时&#xff0c;执行某段代码。watch 属性中的数据需要具有响应式watch 属性可以使用箭头函数watch 属性可以监视一个或者多个响应式数据&#xff0c;并且可以配…

Java之SpringCloud Alibaba【九】【Spring Cloud微服务Skywalking】

Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】跳转Java之SpringCloud Alibaba【二】【微服务调用组件Feign】跳转Java之SpringCloud Alibaba【三】【微服务Nacos-config配置中心】跳转Java之SpringCloud Alibaba【四】【微服务 Sentinel服务熔断】跳转Java之Sprin…

Java Web 实战 19 - What‘s HTTP ?

Whats HTTP ? 一 . HTTP 是什么 ?1.1 理解 HTTP 协议的工作过程1.2 HTTP 的报文格式1.2.1 准备工作1.2.2 认识 HTTP 协议的报文详情请求报文请求响应 二 . HTTP 请求报文2.1 URLURL 的 encode 2.2 HTTP 协议中的方法GETPOST常见面试题 : GET 和 POST 之间的区别 2.3 认识请求…

关于修改了mysql的my_conf文件之后,不能生效问题

个人名片&#xff1a; &#x1f405;作者简介&#xff1a;一名大三在校生&#xff0c;热爱生活&#xff0c;爱好敲码&#xff01; \ &#x1f485;个人主页 &#x1f947;&#xff1a;holy-wangle ➡系列内容&#xff1a; &#x1f5bc;️ tkinter前端窗口界面创建与优化 &…

科研学习|研究方法——使用python强大的Statsmodel 执行假设检验和线性回归

如果你使用 Python 处理数据&#xff0c;你可能听说过 statsmodel 库。 Statsmodels 是一个 Python 模块&#xff0c;它提供各种统计模型和函数来探索、分析和可视化数据。该库广泛用于学术研究、金融和数据科学。 在本文中&#xff0c;我们将介绍 statsmodel 库的基础知识、如…

os.path.join函数用法

os.path.join()是Python中用于拼接文件路径的函数&#xff0c;它可以将多个字符串拼接成一个路径&#xff0c;并且会根据操作系统的规则自动使用合适的路径分隔符。 注&#xff1a;Linux用的是/分隔符&#xff0c;而Windows才用的是\。 该函数属于os.path模块&#xff0c;因此在…

基于单片机的自动变速箱电控系统

**单片机设计介绍&#xff0c; 基于单片机的自动变速箱电控系统 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的自动变速箱电控系统是一种通过单片机来控制车辆自动变速箱的系统。它借助传感器和单片机的协同工作&am…

服务容错之限流之 Tomcat 限流 Tomcat 线程池的拒绝策略

在文章开头&#xff0c;先和大家抛出两个问题&#xff1a; 每次提到服务限流为什么都不考虑基于 Tomcat 来做呢&#xff1f;大家有遇到过 Tomcat 线程池触发了拒绝策略吗&#xff1f; JUC 线程池 在谈 Tomcat 的线程池前&#xff0c;先看一下 JUC 中线程池的执行流程&#x…

Java中利用OpenCV进行人脸识别

OpenCV 概述 ​ OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源计算机视觉库&#xff0c;它提供了丰富的工具和算法&#xff0c;用于处理图像和视频数据。该库由一系列高效的计算机视觉算法组成&#xff0c;涵盖了许多领域&#xff0c;包括目…