目录
- 模板
- 函数模板
- 函数模板概念
- 函数模板格式
- 实例化
- 推演实例化
- 显示实例化
- 类模板
- STL简介
模板
函数模板
函数模板概念
函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定
类型版本。
函数模板格式
template<typename T1, typename T2,......,typename Tn>
返回值类型 函数名(参数列表){}
#include<iostream>
using namespace std;
template<typename T>
void Swap(T& left, T& right)
{
T temp = left;
left = right;
right = temp;
}
int main()
{
int a = 1;
int b = 2;
Swap(a, b);
cout << "a:" << a << "b:" << b;
return 0;
}
typename是关键字,其也可以用class替代
注意:class不可以用struct替代
实例化
推演实例化
通过实参去推形参类型的构成 – 模板的推演
根据推演的类型去生成特定的函数 – 模板的实例化
显示实例化
template<typename T>
T Add(T left, T right)
{
return left + right;
}
int main()
{
cout << Add(1, 2) << endl;
cout << Add<int>(1, 2.1) << endl;
cout << Add<double>(1, 2.1) << endl;
return 0;
}
如果是两个模板类型
Add<int, double>(1, 2.1)
显示实例化使用场景
template<typename T>
T* F(int n)
{
T* p = new T[n];
return p;
}
int main()
{
double* p = F<double>(10);
return 0;
}
模板参数不涉及形参部分
普通函数和函数模板能否同时存在
编译器的调用原则:
1、如果有现成的先调用现成的
2、有更合适的就调用更合适的,没有就将就调用(如果没有函数模板那个Add,对于Add(1.1, 2.2)就将就去掉int那个Add)
int Add(int left, int right)
{
return left + right;
}
template<typename T, typename Y>
T Add(T left, Y right)
{
return left + right;
}
int main()
{
int a = Add(1, 2);
double b = Add(1.1, 2.2);
return 0;
}
类模板
引入
虽然typedef可以解决一部分问题,但是如果a想存int,b想存double就无法解决了 – 这时候就用到类模板了
typedef int StackDateType;
class Stack
{
public:
Stack(int capacity)
{
_a = new StackDateType[capacity];
_capacity = capacity;
_top = 0;
}
~Stack()
{
delete[] _a;
_a = nullptr;
_capacity = 0;
_top = 0;
}
private:
StackDateType* _a;
int _capacity;
int _top;
};
int main()
{
Stack a(10);
Stack b(10);
return 0;
}
用法
对于类模板来说,只能显示实例化
函数模板可以推演实例化、显示实例化
template<class T>
class Stack
{
public:
Stack(int capacity)
{
_a = new T[capacity];
_capacity = capacity;
_top = 0;
}
~Stack()
{
delete[] _a;
_a = nullptr;
_capacity = 0;
_top = 0;
}
private:
T* _a;
int _capacity;
int _top;
};
int main()
{
Stack<int> a(10);
Stack<double> b(10);
return 0;
}
普通类:类名就是类型
类模板实例化的类:类名不是类型,==类名<数据类型>==才是整个类的类型
显示实例化的类型不同,他们就是不同的类
类模板的声明和定义分离
template<class T>
class Stack
{
public:
Stack(int n = 4);
~Stack()
{
delete[] _a;
_a = nullptr;
_capacity = 0;
_top = 0;
}
private:
T* _a;
int _capacity;
int _top;
};
template<class T>
Stack<T>::Stack(int n = 4)
{
_a = new T[capacity];
_capacity = capacity;
_top = 0;
}
int main()
{
Stack<int> a(10);
Stack<double> b(10);
return 0;
}
类模板不允许声明和定义写到不同的文件,会产生链接问题
STL简介
STL(standard template libaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。
C++标准库还包括:IO流库、智能指针库、异常相关的库。
容器:数据结构
空间配置器:内存池,专门给数据结构提供内存,数据结构需要内存的时候不是去new,而是找内存池
配接器:又叫适配器