当前位置: 首页 > news >正文

企业网站制作正规公司网站改自适应 做自适应

企业网站制作正规公司,网站改自适应 做自适应,汉化wordpress主题,网站加入百度广告联盟#x1f525;个人主页#xff1a;Quitecoder #x1f525;专栏#xff1a;c笔记仓 朋友们大家好#xff0c;本篇文章介绍一下模版和对STL进行简单的介绍#xff0c;后续我们进入对STL的学习#xff01; 目录 模版1.泛型编程2.函数模板2.1函数模板的原理2.2模版的实例化… 个人主页Quitecoder 专栏c笔记仓 朋友们大家好本篇文章介绍一下模版和对STL进行简单的介绍后续我们进入对STL的学习 目录 模版1.泛型编程2.函数模板2.1函数模板的原理2.2模版的实例化2.3函数模板的匹配 3.类模板 STL1.什么是STL 模版 1.泛型编程 泛型编程是一种编程范式它强调的是在编写代码时能够使得算法、数据结构或函数能够对各种数据类型都能工作而无需因数据类型的不同而重写代码。泛型编程的核心思想是通过抽象化类型来增加软件的复用性、灵活性和类型安全 例如我们要写完成交换函数 void Swap(int left, int right) {int temp left;left right;right temp; } void Swap(double left, double right) {double temp left;left right;right temp; } void Swap(char left, char right) {char temp left;left right;right temp; } ......使用函数重载虽然可以实现但是有几个不好的地方 重载的函数仅仅是类型不同代码复用率比较低只要有新类型出现时就需要用户自己增加对应的函数代码的可维护性比较低一个出错可能所有的重载均出错 那能否告诉编译器一个模子让编译器根据不同的类型利用该模子来生成代码呢 在泛型编程中通常会使用到“泛型”这个概念它允许你在定义函数、类或接口时使用类型参数这个类型参数随后可以在使用函数、类或接口时被具体的类型所替换。这样同一套逻辑就可以适用于多种数据类型而不需要为每种类型编写重复的代码 在C中可以使用模板template来实现泛型编程 2.函数模板 函数模板代表了一个函数家族该函数模板与类型无关在使用时被参数化根据实参类型产生函数的特定类型版本 函数模板允许你编写与类型无关的函数这意味着你可以创建一个通用的函数该函数可以接受多种类型的参数 基本语法 template typename T T functionName(T parameter) {// 函数实现 }templatetypename T void Swap( T left, T right) {T temp left;left right;right temp; }在这里typename T 定义了一个类型参数它在函数模板被实例化时将被具体的类型替换。例如如果你用 int 类型实例化该模板编译器将生成一个接受 int 参数并返回 int 类型值的函数T代表类型 有了这个模板我们不需要再写几个函数重载 templatetypename T void Swap(T left, T right) {T temp left;left right;right temp; }int main() {int a 1, b 2;double c 3.0, d 4.5;Swap(a, b);Swap(c, d);return 0; }注意typename是用来定义模板参数关键字也可以使用class(切记不能使用struct代替class) 2.1函数模板的原理 函数模板是一个蓝图它本身并不是函数是编译器用使用方式产生特定具体类型函数的模具。所以其实模板就是将本来应该我们做的重复的事情交给了编译器 所以这里调用的并不是我们的模版void Swap(T left, T right)编译器会根据我们的调用进行类型推导 在函数模板的调用中编译器大多能够自动推导出模板参数的具体类型这一过程称为类型推导。在大多数情况下编译器通过查看函数调用时提供的参数类型来决定模板参数的类型 根据推导结果生成一个新的函数来调用比如上述示例 Swap(a, b); 00007FF6AAA81995 lea rdx,[b] 00007FF6AAA81999 lea rcx,[a] 00007FF6AAA8199D call Swapint (07FF6AAA812DAh) Swap(c, d); 00007FF6AAA819A2 lea rdx,[d] 00007FF6AAA819A6 lea rcx,[c] 00007FF6AAA819AA call Swapdouble (07FF6AAA8131Bh) 这两个函数是编译器根据函数模版和需要的类型生成的这个过程是编译器实现的 在编译器编译阶段对于模板函数的使用编译器需要根据传入的实参类型来推演生成对应类型的函数以供调用。比如当用double类型使用函数模板时编译器通过对实参类型的推演将T确定为double类型然后产生一份专门处理double类型的代码对于字符类型也是如此 2.2模版的实例化 用不同类型的参数使用函数模板时称为函数模板的实例化。模板参数实例化分为隐式实例化和显式实例化 隐式实例化让编译器根据实参推演模板参数的实际类型 templateclass T T Add(const T left, const T right) {return left right; } int main() {int a1 10, a2 20;double d1 10.0, d2 20.0;Add(a1, a2);Add(d1, d2);return 0; }那么能这样实现吗 Add(a1, d1);该语句不能通过编译因为在编译期间当编译器看到该实例化时需要推演其实参类型通过实参a1将T推演为int通过实参d1将T推演为double类型但模板参数列表中只有一个T编译器无法确定此处到底该将T确定为int或者 double类型而报错 注意在模板中编译器一般不会进行类型转换操作 此时有两种处理方式 用户自己来强制转化使用显式实例化 强制转换 Add(a, (int)d); Add((double)a,b);int main() {int a 10;double b 20.0;// 显式实例化Addint(a, b);return 0; }00007FF7915F19C5 call Addint (07FF7915F13D4h)2.3函数模板的匹配 一个非模板函数可以和一个同名的函数模板同时存在而且该函数模板还可以被实例化为这个非模板函数 // 专门处理int的加法函数 int Add(int left, int right) {return left right; } // 通用加法函数 templateclass T T Add(T left, T right) {return left right; } void Test() {Add(1, 2); // 与非模板函数匹配编译器不需要特化Addint(1, 2); // 调用编译器特化的Add版本 }模板特化允许程序员为模板提供特定类型的特殊实现。当编译器遇到一个已经有特化实现的模板实例时它会使用这个特化版本而不是通用模板。特化可以是全特化针对所有模板参数都提供具体类型也可以是偏特化仅对模板的部分参数提供具体类型 对于非模板函数和同名函数模板如果其他条件都相同在调动时会优先调用非模板函数而不会从该模板产生出一个实例。如果模板可以产生一个具有更好匹配的函数 那么将选择模板 // 专门处理int的加法函数 int Add(int left, int right) {return left right; } // 通用加法函数 templateclass T1, class T2 T1 Add(T1 left, T2 right) {return left right; } void Test() {Add(1, 2); // 与非函数模板类型完全匹配不需要函数模板实例化Add(1, 2.0); // 模板函数可以生成更加匹配的版本编译器根据实参生成更加匹配的Add函数 }3.类模板 templateclass T class Stack { public:Stack(int 10): _a(new T[capacity]), _size(0), _capacity(capacity){}void Push(const T x){}~Stack(); private:T* _a;int _top;int _capacity; }; 注意Stack不是具体的类是编译器根据被实例化的类型生成具体类的模具 类模板实例化与函数模板实例化不同类模板实例化需要在类模板名字后跟然后将实例化的类型放在中即可类模板名字不是真正的类而实例化的结果才是真正的类 Stackint s1; Stackdouble s2;Stack类名Stackint才是类型 ~Stack();使用析构函数演示在类中声明在类外定义 template class T StackT::~Stack() {if(_a)delete[] _a;_top _capacity 0; }类模板中函数放在类外进行定义时需要加模板参数列表 STL 1.什么是STL STL(standard template libaray-标准模板库)是C标准库的重要组成部分不仅是一个可复用的组件库而且是一个包罗数据结构与算法的软件框架 发展历史 项目Value原始版本Alexander Stepanov、Meng Lee 在惠普实验室完成的原始版本本着开源精神他们声明允许任何人任意运用、拷贝、修改、传播、商业使用这些代码无需付费。唯一的条件就是也需要向原始版本一样做开源使用。 HP 版本–所有STL实现版本的始祖P. J. 版本由P. J. Plauger开发继承自HP版本被Windows Visual C采用不能公开或修改缺陷可读性比较低符号命名比较怪异RW版本由Rouge Wage公司开发继承自HP版本被C Builder 采用不能公开或修改可读性一般SGI版本由Silicon Graphics Computer SystemsInc公司开发继承自HP版本。被GCC(Linux)采用可移植性好可公开、修改甚至贩卖从命名风格和编程风格上看阅读性非常高。我们后面学习STL要阅读部分源代码主要参考的就是这个版本 STL的六大组件 容器Containers这些是用来管理某一类对象的集合的数据结构。STL容器分为序列式容器如vector、list、deque等和关联式容器如set、map等 迭代器Iterators迭代器是一种使程序员能够遍历容器中的元素而不需要了解容器内部实现细节的对象。迭代器充当容器与算法之间的桥梁。 算法AlgorithmsSTL提供了一大套算法比如排序sort、查找find、替换replace、计数count、遍历for_each等这些算法可以作用于容器存储的数据上。 函数对象Function objects也称为仿函数Functors它们是实现了operator()的类的对象可以作为算法的某些操作的准则或策略。 适配器Adapters适配器可以修改容器或函数对象的接口使其适用于不同的场合。例如stack、queue和priority_queue是容器适配器。 分配器Allocators用于定义内存模型允许STL容器管理存储空间的分配和释放。 STL确实是现代C编程的基石它的设计哲学、灵活性以及对编程效率的提升有着深远的影响
http://www.zqtcl.cn/news/547704/

相关文章:

  • 佛山做营销型网站建设深圳宝安区租房
  • 做汽车团购的网站建设营销方案有哪些
  • 做设计的网站网络公关什么意思
  • 一般课程网站要怎么做做钓鱼网站软件下载
  • 济南网站建设92jzh收不到wordpress的邮件
  • 一键优化在哪里打开新手怎么入行seo
  • 网站建设的费用明细创建公司网站需要注意什么
  • 微网站怎么做的好宣传片拍摄服务
  • 抚州网站开发机构wordpress开源
  • 企业营销网站建设不属于网页制作工具
  • 呼和浩特网站建设信息建服装类网站需要考虑的因素
  • 百度站长平台工具南京开发app的公司
  • 济南如何挑选网站建设公司设计 网站 现状
  • 网站开发建设流程图wordpress 插件 简码
  • 信宜网站开发公司阿里指数app下载
  • AAP网站开发需要多少钱网站核验通知书
  • 网站续费模板wordpress安装到ESC
  • 网站网址大全做商品条形码的网站
  • php购物网站开发成品各大网站收录提交入口
  • 怎么办个人网站网络管理系统中故障管理的目标是
  • 想做网站的客户在哪找下载网站系统源码
  • 网站建设是固定资产还是列费用soho做网站
  • 学校建设评建工作网站应用中心软件
  • 网站建设公司如何拓宽业务跨境进口网站怎么做
  • 邢台企业建站速卖通网站怎样做店面的二维码
  • 网上竞价采购网站建设wordpress添加发布视频
  • 隐形眼镜网站开发的经济效益微企点自助建站系统
  • 延庆网站建设优化seo中山百度seo排名公司
  • 做灯箱的网站做一个app需要多少成本
  • 江苏建设厅网站石家庄建设信息网