模板
时间:2019-11-27
本文章向大家介绍模板,主要包括模板使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
1.冒泡排序
代码:
void Sort(int* arr,int nLength) { int i; int k; for(i=0;i<nLength-1;i++) { for(k=0;k<nLength-1-i;k++) { if(arr[k]>arr[k+1]) { int temp = arr[k]; arr[k] = arr[k+1]; arr[k+1] = temp; } } } }
最简单的排序,不多做说明;
有个缺点:
需要排序的可能还有其它类型,比如double、float、short、结构、类等,不限于int;
这样导致需要给每一种类型都写一个相同的排序方法;
2.折半查找
代码:
int Find(int* arr,int nLength,int nElement) { int nBegin = 0,nEnd = nLength-1,nIndex; while(nBegin<=nEnd) { nIndex = (nBegin+nEnd)/2;//(nBegin+nEnd)>>1 if(nElement > arr[nIndex]) { nBegin = nIndex+1; } else if(nElement < arr[nIndex]) { nEnd = nIndex-1; } else { return nIndex; } } return -1; }
查找就是从一堆数据中找到自己需要的数据;
查找有两类:
顺序查找 ->从头开始一个个找,适合于没排序时查找;
例如:从一个数组{1,5,3,7,9}中找3的下标;从第一个数开始往后找,找到3后返回3的下标即可;
折半查找 ->前提条件是排好序,每次查找砍掉一半,可以提高查找效率;
例如: 从数组{1,3,5,7,9,11,13}中找出3的下标;
用数组长度/2得到下标;7/2=3;
找到下标处的数与目标数比较;第3个数是5,5>3说明3在5前面,于是5和它后面的部分不再考虑;依次类推找到目标数;
3.模板
例如:上面的冒泡排序和折半查找只能适用于int型;
如果想适应于多种类型,可以使用模板;
模板的本质就是代码的复制;
编译时编译器将会模板替换成对应的类型;
使用模板和不使用模板的反汇编完全一样;
可以利用模板来实现链表结构;
函数中的类型不确定时可以用模板
例如:用模板修改后的冒泡排序和折半查找
template<class T> void Sort(T arr,int nLength) { int i; int k; for(i=0;i<nLength-1;i++) { for(k=0;k<nLength-1-i;k++) { if(arr[k]>arr[k+1]) { int temp = arr[k]; arr[k] = arr[k+1]; arr[k+1] = temp; } } } } template<class T> void Print(T arr,int nLength) { int i; for(i=0;i<nLength;i++) { printf("%d\n",arr[i]); } } template<class T,class E> int Find(T arr,int nLength,E nElement) { int nBegin = 0,nEnd = nLength-1,nIndex; while(nBegin<=nEnd) { nIndex = (nBegin+nEnd)/2;//(nBegin+nEnd)>>1 if(nElement > arr[nIndex]) { nBegin = nIndex+1; } else if(nElement < arr[nIndex]) { nEnd = nIndex-1; } else { return nIndex; } } return -1; } int main(int argc, char* argv[]) { char arr[] = {2,6,1,8,4,3}; Sort(arr,6); Print(arr,6); printf("---------------\n"); int x = Find(arr,6,1); printf("%x\n",x); return 0; }
也可以在结构体和类中使用模板:结构体中的类型不确定时可以用模板
template<class T,class M> struct Base { T x; T y; M a; M b; T Max() { if(x>y) { return x; } else { return y; } } M Min() { if(a<b) { return a; } else { return b; } } }; int main(int argc, char* argv[]) { Base<int,char> base; base.x = 10; base.y = 20; base.a = 1; base.b = 2; int x = base.Max(); int y = base.Min(); printf("%d %d\n",x,y); return 0; }
原文地址:https://www.cnblogs.com/ShiningArmor/p/11940217.html
- 分分钟搭建Oracle环境 (r9笔记第23天)
- Java面试系列25-spring(4)-国际化、加入web容器,标签、事务等
- Java面试系列24-spring(3)-配置文件相关问题
- Java基础-day03-基础题
- 简单易学的机器学习算法——EM算法
- 备库跳归档恢复的有趣案例(r9笔记第19天)
- Java基础-day02-代码题
- 优化算法——拟牛顿法之L-BFGS算法
- 一次性能突发情况的紧急修复(r9笔记第18天)
- Java基础-day02-基础题
- 简单易学的机器学习算法——AdaBoost
- 用脚本来讲一个技术生活的故事 (r9笔记第32天)
- 优化算法——拟牛顿法之BFGS算法
- 对于tnsping的连接超时的功能补充(二)(r9笔记第22天)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 如何在K8S上备份和恢复MySQL
- 学习 | Spring Cloud Config 从入门到精通
- 模仿百度新闻的一部分
- 腾讯云录音文件识别-iOS SDK
- ESP8266如何设置wifi。
- ESP8266搭建web服务器
- 关于持续交付中Git分支管理的思考
- 轻松应对并发问题,Newbe.Claptrap 框架中 State 和 Event 应该如何理解?
- 如何暂停一个正在运行的线程?
- WebMonitor采集端优化之路
- 美颜算法之自动祛斑算法实现 | 案例分享
- 附025.kubeadm部署Kubernetes更新证书
- 消息提示时间的格式化例子(小程序)
- 【Spark】用scala2.11编译打包构建镜像
- 移动端事件穿透的原理与解决方案