C++思考和一些代码规范(09/28)

news/2024/12/21 22:58:43/

文章目录

    • 一、C++的一些思考记录
      • 1)C++函数进化(函数->函数指针->函数模板->仿函数|函数对象->lambda表达式)

一、C++的一些思考记录

1)C++函数进化(函数->函数指针->函数模板->仿函数|函数对象->lambda表达式)

①简单的比较函数

#include <iostream>int countMatchElements(int* beg,int* end)
{int result = 0;for(;beg!=end;++beg){if(*beg > 20) ++result;}return result;
}int main()
{int intArray[]= { 11,16,21,19,17,30  };//统计大于20的元素数量std::cout<< countMatchElements(intArray,intArray+6) <<std::endl;return 0;
}

②加入函数指针的优化(改变:传入不同的函数)

#include <iostream>int countMatchElements(int* beg,int* end,bool(*pred)(const int&))
{int result = 0;for(;beg!=end;++beg){if(pred(*beg)) ++result;}return result;
}//实际比较函数
bool isGreater20(const int &val) {return val > 20};
bool isGreater25(const int &val) {return val > 25};
bool isLess10(const int &val) {return val < 10};int main()
{int intArray[]= { 11,16,21,19,17,30  };//优化后的函数(用了函数指针)std::cout<< countMatchElements(intArray,intArray+6,isGreater20) <<std::endl;return 0;
}

③函数模板进一步优化(改变:传入的函数参数为不同类型)

#include <iostream>
template<typename T>
int countMatchElements(T* beg,T* end,bool(*pred)(const T&))
{int result = 0;for(;beg!=end;++beg){if(pred(*beg)) ++result;}return result;
}//实际比较函数
bool isGreater20(const int &val) {return val > 20;}
bool isGreater25(const int &val) {return val > 25;}
bool isLess10(const int &val) {return val < 10;}bool isTinyStr(const stdLLstring &val) {return val.size() <=3;}int main()
{int intArray[]= { 11,16,21,19,17,30  };//优化后的函数(用了函数指针)std::cout<< countMatchElements(intArray,intArray+6,isGreater20) <<std::endl;return 0;
}

④用仿函数进一步优化(改变:传入的函数参数为不同值,之前无论是模板还是函数指针都是写死的)

#include <iostream>
template<typename T,typename Pred>
int countMatchElements(T* beg,T* end,Pred  pred)
{int result = 0;for(;beg!=end;++beg){if(pred(*beg)) ++result;}return result;
}//仿函数
template<typename T>
struct Greater{T mVal;////explicit只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函数是显示explicit Greater(T value):mVal(value) {} //构造函数初始化mValbool operator() (const T& val) const { return val > mVal;}//重载函数调用运算符
};int main()
{int intArray[]= { 11,16,21,19,17,30  };//阈值设置为20Greater<int> greater20{20};//不过仿函数无法给函数指针赋值//优化后的函数(用了函数指针)std::cout<< countMatchElements(intArray,intArray+6,greater20) <<std::endl;return 0;
}

⑤仿函数代码难以阅读,可以用lambda表达式改造下

#include <iostream>
template<typename T,typename Pred>
int countMatchElements(T* beg,T* end,Pred  pred)
{int result = 0;for(;beg!=end;++beg){if(pred(*beg)) ++result;}return result;
}//仿函数
template<typename T>
struct Greater{T mVal;////explicit只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函数是显示explicit Greater(T value):mVal(value) {} //构造函数初始化mValbool operator() (const T& val) const { return val > mVal;}//重载函数调用运算符
};int main()
{int intArray[]= { 11,16,21,19,17,30  };//阈值设置为20//Greater<int> greater20{20};//不过仿函数无法给函数指针赋值auto greater20 = [](auto &val)->bool {return val>20;};//优化后的函数(用了函数指针)std::cout<< countMatchElements(intArray,intArray+6,greater20) <<std::endl;return 0;
}

http://www.ppmy.cn/news/1127881.html

相关文章

Kubernetes(K8s):未来云原生应用的引擎

文章目录 Kubernetes的核心概念和架构为什么K8s是构建云原生应用的首选工具&#xff1f;云原生应用的好处和挑战容器编排的重要性&#xff1a;Docker和KubernetesKubernetes生态系统&#xff1a;核心组件和附加工具实际应用&#xff1a;企业如何在生产环境中使用K8s未来展望&am…

Github贡献PR六部曲

Github贡献PR三部曲 1. fork代码 选中自己要贡献PR的仓库&#xff0c;点击Github右上角的fork2. clone代码 git clone gitgithub.com:{username}/seata.git3. 设置提交信息 git config user.name {username} git config user.email {email}git remote add upstream gitgith…

Oracle表锁了怎么办?

最近同事在开发过程中&#xff0c;由于网络或电脑卡顿导致PLSQL执行 update 语句操作一直无响应。随后同事就将PLSQL关闭重新打开再次执行 update 语句。来来回回操作了多次。最终导致了表被锁定。 解决问题 1、查看锁表情况 ---1、查看那些表被锁住 select b.owner, b.objec…

el-menu 导航栏学习-for循环封装(2)

基于el-menu 导航栏学习&#xff08;1&#xff09; 对于导航栏主菜单NavMenuDemo.vue进行for循环改进&#xff0c;代码如下所示&#xff1a; <template> <el-container> <el-aside width"200px"> <el-menu :default-active"this.$route.…

Android 10以上出现的 android Permission denied 读写权限问题解决方法

原因&#xff1a; 从Android 10 开始&#xff0c;应用即使申请了权限&#xff0c;也只能读写自己外部存储的私有目录&#xff0c;就是Android/data/对应应用包名 下的相关目目录。除此之外任何目录的读写都会被拒绝&#xff0c;并提示android Permission denied。 解决方案 在A…

代理IP与Socks5代理:跨界电商之安全防护与智能数据引擎

第一部分&#xff1a;跨界电商的兴起与网络安全挑战 1.1 跨界电商的崭露头角 跨界电商已经成为全球贸易的新引擎&#xff0c;企业纷纷踏上了拓展国际市场的征程。 1.2 网络安全的不容忽视 跨界电商的增长也伴随着网络安全威胁的增加。黑客攻击、数据泄露和欺诈行为等风险呈…

【iOS】使用respondsToSelector方法前是否需要对方法调用者进行判空操作?

前情 在iOS开发中&#xff0c;经常需要将事件传递给上层代理去处理&#xff0c;这个时候会用到『respondsToSelector』去检测上层代理是否有实现对应的方法&#xff0c;如果实现了&#xff0c;才会去调用。 - (void)methodExample {if ([self.delegate respondsToSelector:se…

springboot 简单配置mongodb多数据源

准备工作&#xff1a; 本地mongodb一个创建两个数据库 student 和 student-two 所需jar包&#xff1a; # springboot基于的版本 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId>&l…