【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表达式】
相关文章:
【C++函数的进化】函数指针,模板,仿函数,lambda表达式
/*** poject * author jUicE_g2R(qq:3406291309)* file C函数的进化* * language C* EDA Base on VS2022* editor Obsidian(黑曜石笔记软件)* * copyright 2023* COPYRIGHT 原创学习笔记:转载需获得博…...
云服务器windows service2022 部署git服务器
1 安装 下载地址gitblit 解压到你的一个目录,我这里给的是C:\gitblit 根据官网提示要下载jre or jdk7.0,这里建议使用下载jre (jdk 有时候运行出问题,或者2个都安装),自行安装java,这里不做环境配置的说明 进入c:\gitblit\data 目录里面找到,defaults.properties 文件,编辑主…...
Linux_Docker修改Docker Root Dir
今天遇到需求,要修改一下docker容器和镜像的存储位置,默认位置为/var/lib/docker目录下,要修改到/new/dockerFile目录下。 停止docker服务 sudo service docker stop 备份docker容器镜像 移动/var/lib/docker目录下的文件到/dockerFile目录…...
解决requests 2.28.x版本SSL错误:证书验证失败
1、问题背景 在使用requests 2.28.1版本时,我进行HTTP post传输报告负载时,由于SSL验证设置为True,请求失败,错误如下:(Caused by SSLError(SSLCertVerificationError(1, ‘[SSL: CERTIFICATE_VERIFY_FAILED] certifi…...
【开源】基于Vue.js的开放实验室管理系统的设计和实现
项目编号: S 013 ,文末获取源码。 \color{red}{项目编号:S013,文末获取源码。} 项目编号:S013,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容2.1 实验室类型模块2.2 实验室模块2.3 实…...
使用composer安装ffmpeg的步骤
以下是使用composer安装ffmpeg的步骤: 1.在laravel根目录下执行以下命令安装ffmpeg: composer require php-ffmpeg/php-ffmpeg 2.如果不指定版本号,则默认使用0.14版本。 3.执行以上命令后,composer会自动下载并安装ffmpeg。 …...
RT-DETR优化策略:轻量级Backbone改进 | 高效模型 (Efficient MOdel, EMO),现代倒残差移动模块设计|ICCV2023
🚀🚀🚀本文改进:面向移动端的轻量化网络模型——EMO,它能够以相对较低的参数和 FLOPs 超越了基于 CNN/Transformer 的 SOTA 模型,支持四个版本EMO_1M, EMO_2M, EMO_5M, EMO_6M,参数量如下,相对于自带的rtdetr-l、rtdetr-x有很大提升 layersparametersgradientsEMO_1…...
一些nginx命令
1.停止nginx nginx -s quit systemctl stop nginx.service 立即停止 nginx-s stop 杀死nginx进程 killall nginx 2.启动命令 nginx systemctl start nginx.service 3.查看nginx进程 ps aux | grep nginx 4.重启nginx服务 systemctl restart nginx.service 5.重载…...
WPF自定义控件介绍
在WPF中,自定义控件通常是指从头开始创建一个新控件或从现有控件继承并扩展其功能。自定义控件与用户控件(User Control)不同,用户控件是通过组合其他控件来构建的,而自定义控件通常涉及对控件的更底层的渲染和行为进行…...
JUNIT使用和注意、以及断言的介绍使用、SpringBoot Test测试类的使用、maven配置使用junit详细介绍
参考文章: https://www.cnblogs.com/zhukaile/p/14514238.html,https://blog.csdn.net/qq_36448800/article/details/126438339 一、什么是单元测试 在平时的开发当中,一个项目往往包含了大量的方法,可能有成千上万个。如何去保…...
强化学习在文生图中的应用:Training Diffusion Models with Reinforcement Learning
论文链接:Training Diffusion Models with Reinforcement Learning项目地址:Training Diffusion Models with Reinforcement Learning官方代码:https://github.com/kvablack/ddpo-pytorch/tree/maintrl实现:https://huggingface.co/docs/trl/ddpo_trainer🤗关注公众号 fu…...
【C语言】数组下标为啥从0开始?下标越界访问一定报错吗?
本篇文章目录 0. 相关文章1. 下标从0开始问题2. 数组下标越界不报错问题 0. 相关文章 指针与指针变量数组名不是首元素地址的的2个例外拨开指针和数组名之间的迷雾 1. 下标从0开始问题 原因是:数组下标访问本质是“指针解引用操作”,而指针又是地址&am…...
机器学习-搜索技术:从技术发展到应用实战的全面指南
在本文中,我们全面探讨了人工智能中搜索技术的发展,从基础算法如DFS和BFS,到高级搜索技术如CSP和优化问题的解决方案,进而探索了机器学习与搜索的融合,最后展望了未来的趋势和挑战,提供了对AI搜索技术深刻的…...
Axelar、J.P.Morgan Onyx、Apollo 完成概念验证,向跨区块链自动化投资领域探索
J.P.Morgan Onyx、Apollo、Axelar、Oasis Pro 以及 Provenance Block Chain 展开合作,共同进行互操作性概念验证(Proof-of-Concept,PoC)。 新加坡 — Axelar Inc.、Oasis Pro 、Provenance Blockchain 与 J.P.Morgan Onyx 以及 Apollo 通过新…...
wpf devexpress添加TreeListControl到项目
此教程示范如何添加TreeListControl到项目和绑定控件自引用数据源: 添加数据模型 绑定tree,并添加如下字段到数据源对象: Key字段包含唯一值索引节点 Parent字段包含父索引节点 添加数据模型(Employee和Staff类)到…...
WPF创建自定义控件编译通过但是找不到资源
报错: 原因: 路径写错了: 不是这样: Source"pack://application:,,,/Controls/Styles/xTabControl.xaml" 而是这样: Source"pack://application:,,,/项目名;component/Controls/Styles/xTabControl.xaml …...
PHP 中传值与传引用的区别,什么时候传值什么时候传引用?
传值:当使用传值的方式时,函数或方法会创建原始变量的一个副本,并将该副本传递给函数或方法。在函数或方法内部,对副本的任何修改都不会影响到原始变量。当函数或方法执行完毕后,副本被销毁,不再使用。 传引…...
es安装方式
es安装方式 1.下载镜像的方式 分词器 kibana和es和容器互通的方式 docker network create es-net开始拉去镜像的方式 docker pull kibana:7.12.1运行镜像的方式 docker run -d \--name es \-e "ES_JAVA_OPTS-Xms512m -Xmx512m" \-e "discovery.typesingle-…...
苍穹外卖项目笔记(2)
1 Nginx 反向代理和负载均衡 1.1 概念 【Tips】可以看到前端请求地址和后端接口地址并不匹配,这里涉及到 nginx 反向代理 ,就是将前端发送的动态请求由 nginx 转发到后端服务器 使用 nginx 作反向代理的好处: 提高访问速度(在请…...
hive更改表结构的时候报错
现象 FAILED: ParseException line 1:48 cannot recognize input near ADD COLUMN compete_company_id in alter table statement 23/11/14 17:59:27 ERROR org.apache.hadoop.hive.ql.Driver: FAILED: ParseException line 1:48 cannot recognize input near ADD COLUMN compe…...
HTML新手入门教程(二)
一、网页图像标签以及超链接 接着上篇文章,这次我们来学习一下图像标签、超链接标签如何使用,以及使用效果。本文章我们以<img>和<a>标签来展开教学。 在 HTML 中,<img>标签用于在网页中插入图像。它的作用是可以把文档中…...
告别繁琐流程:用快马AI生成脚本实现龙虾部署效率飞跃
最近在团队里负责微服务部署时,发现每次更新代码都要重复执行十几个步骤:拉代码、装依赖、打镜像、推仓库、重启容器...一套流程下来至少半小时,还容易手滑出错。于是研究了一套自动化方案,用Python脚本把整个流程串了起来&#x…...
IP被封禁?5招快速恢复访问权限
使用网站或平台时,如果你突然遇到“Your IP has been banned(您的IP已被封禁)”的提示,通常意味着该平台已经限制了你当前网络的访问权限。很多人第一反应是账号出问题,但实际上,IP封禁针对的是网络环境&am…...
拯救数字青春:GetQzonehistory让QQ空间记忆永久安家
拯救数字青春:GetQzonehistory让QQ空间记忆永久安家 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 在这个信息爆炸的时代,我们的青春记忆正以数据形式储存在各大…...
基于改进型多目标粒子群算法的电铲永磁同步电机过载工况下电磁-热双向耦合优化设计
基于改进型多目标粒子群算法的电铲永磁同步电机过载工况下电磁-热双向耦合优化设计 摘要 本文针对矿山电铲提升系统用永磁同步电机在过载起升、卡斗遇硬岩等瞬态超载工况下易发生温升异常,影响电机可靠性的问题,提出了一种基于电磁-热双向耦合的多目标优化设计方法。首先,…...
手把手教你用Python计算斯皮尔曼相关系数:从手动推导到scipy一键调用
深入掌握Python中的斯皮尔曼相关系数:从数学原理到实战应用 在数据分析领域,理解变量之间的关系是至关重要的。斯皮尔曼相关系数作为一种非参数统计量,能够揭示数据间的单调关联,而不仅仅是线性关系。本文将带你从基础概念出发&am…...
新手也能懂:用Altium Designer搞定SPI Flash、eMMC和USB3.0的PCB等长与阻抗控制
Altium Designer实战:SPI Flash、eMMC与USB3.0的等长布线及阻抗控制指南 刚接触高速PCB设计时,面对密密麻麻的规则手册总让人望而生畏。3H原则、500mil误差、阻抗匹配这些术语听起来像天书,但当你用Altium Designer(AD)…...
Phi-4-mini-reasoning惊艳效果:自动识别题目所属数学分支并推荐解法策略
Phi-4-mini-reasoning惊艳效果:自动识别题目所属数学分支并推荐解法策略 1. 模型介绍 Phi-4-mini-reasoning是微软推出的3.8B参数轻量级开源模型,专为数学推理、逻辑推导和多步解题等强逻辑任务设计。这个模型主打"小参数、强推理、长上下文、低延…...
突破Windows限制:告别模拟器烦恼的安卓应用高效工具
突破Windows限制:告别模拟器烦恼的安卓应用高效工具 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 在数字化办公与娱乐融合的今天,Windows用户…...
2025年深度评测:掌握Liebling主题,解锁Ghost博客的现代设计潜力
2025年深度评测:掌握Liebling主题,解锁Ghost博客的现代设计潜力 【免费下载链接】liebling Beautiful and clean Ghost theme that is easy and comfortable to use. To get the latest version please head over the releases page 👉&#…...
