(一)模板
1.函数模板
(1)背景描述:
同种逻辑处理不同类型的数据,需要重新写一个函数;
多个函数会给函数的修改带来困难、不一致问题
重载函数虽然为使用者提供了方便,但是编写者仍然需要都写一遍。
(2)模板使用
template<模板参数表>
函数定义
模板参数表的内容
参数名称 | 标识符 |
---|---|
类型参数 | class /typename标识符(类型也可以作为参数传递) |
常量参数 | 类型说明符 标识符 |
模板参数 | template <参数表>class 标识符 |
eg:求绝对值函数模板
# include <iostream>
using namespace std;
template<typename T>
T abs(T x){
return x<0?-x:x;
}
int main(){
int n = -5;
double d = -5.5;
cout<<abs(n)<<endl;
cout<<abs(d)<<endl;
}
【注意】
2.类模板
(1)背景描述
为类声明一种模式;
使得类中的某系数据成员、成员函数参数、成员函数的返回值能取任意类型。
(2)模板使用
抽象数据类型
3.数组类模板
(1)背景描述
长度不可调、下标越界无法处理;
数组类——直接访问的线性群体
静态数组具有固定元素个数的群体、元素可以通过下标直接访问;
动态数组由一系列位置连续,任意数量相同类型的元素组成,元素个数在程序运行时可以改变;
< vector>实际上就是封装了一个动态数组
(2)模板使用
首先保证后一段链表有头结点,不然链表的后半部分就丢了
指针转换运算符使用
4.结点类模板
(1)背景描述
数组:在插入和删除元素时,其他元素也在频繁的移动
链表:动态数据结构,可以用来表示顺序访问的线性群体
由系列节点组成,结点可以在运行时动态生成(数据域和指向链表中下一个结点的指针);
链表的头指针非常重要
(2)模板使用
//9_5.h
#ifndef