文章目录
🐤模板简介
🀄️模板声明语法
在C++中,模板让程序员能够定义一种适用于不同对象的行为,这听起来有点儿像宏,但宏不是类型安全的,而模板是类型安全的>。
模板关键字以template开头接下来是参数列表
模板函数
template<typename T1,typename T2=T1>
bool TemplateFunction(const T1& param1,const T2& param2);
模板类
template <typename T1,typename T2=T1>
class MyTemplate
{
private:
T1 member1;
T2 member2;
public:
T1 GetObj()
{
return member1;
}
};
🀄️模板函数
下面来一个模板声明,返回两个参数中较大的一个
template <typename objType>
const objType& GetMax(const objType& value1,const objType& value2)
{
if(value1>value2)
return value1;
else
return value2;
}
下面是一个使用该模板的实例
int num1=45;
int num2=56;
int maxVal=GetMax<int>(num1,num2);
double db1=1.1;
double db2=1.001;
double maxVal=GetMax<double>(db1,db2);
调用函数时并非一定需要指定类型,因此也可以int maxVal=GetMax(num1,num2)>
但是对于模板类则必须要指定类型
🀄️模板类
模板类的出现方便我们随时更改创建对象的私有成员类型,比如int time,time可能是年,但如果我们想存秒就有可能超出int的范围,我们需要转为 longlong,因此我们可以使用模板类来解决这个问题,创建类的模板,并不具体指定成员类型
template<typename T>
class HoldVarTypeT
{
private:
T value;//此处用一个T来代替
}
🀄️声明包含多个函数参数的模板
同样的我们也可以声明包含多个参数的模板,多个参数之间用逗号隔开就行,如果要声明一个泛型类用于存储两个类型可能不同的对象。
template<typename T1,typename T2>
class HoldVarTypeT
{
private:
T1 value1;//此处用一个T来代替
T2 value2;
//构造函数省略
}
//创建对象时:
template <int,double> h1(1,1.43);//这里就可以指定不同类型的数
在编译器看来,仅当模板类使用的时候,其代码才存在,所以即使我们定义了一个模板类,只要我们不使用,编译器将忽略它,当我们实例化一个模板类的时候,就相当于命令编译器创建一个类
🀄️使用static_assert执行编译阶段检查
static_assert能够在不满足指定条件的时候禁止编译,例如static_assert(sizeof(T)!=sizeof(int),“NO int please”),如果他们相等就显示一条错误信息。
注意:
在任何情况下都应该使用模板而不是宏,因为模板是类型安全的,而宏不是类型安全的。
🐤标准模板库简介
模板的一个最重要而强大的应用是在标准模板库(STL)中。STL由一系列模板类和模板函数组成,分别包含泛型实用类和算法。
STL是一组模板类和函数,向程序员提供了:
- 用于存储信息的容器
- 用于访问容器存储的信息的迭代器
- 用于操作容器内容的算法
🀄️STL容器
容器是用来干嘛的?
容器是用来存储数据的STL类,STL存储了两种类型的容器类:
- 顺序容器
- 关联容器
顺序容器
在此处我们只进行一下说明有什么
vector:操作和动态数组一样,只允许在末尾插入数据
deque:操作和动态数组类似,但是允许在开头插入和删除元素
list:与双向链表一样
forward_list:与单向链表一样
顺序容器具有插入速度快但查找速度相对较慢的特征
关联容器
关联容器按照指定的顺序存储数据,插入数据的速度慢,但是会加快查询速度
set:存储各不相同的值,在插入时进行排序,容器的复杂度为对数
unorderset:存储各不相同的值在插入时进行排序,容器的复杂度为常数
map:存储键值对,并根据唯一的键进行排序,复杂度为对数
unordermap:复杂度为对数
multiset:与set类似但是允许存储多个值相同的项
multi
🀄️STL算法
有关STL算法的使用实在太多了,这里就简单说几个常用的
find:在集合中查找值
reverse:翻转集合的排列顺序
当然如果你有足够的兴趣想去了解一下这些推荐这个网站:CPlusPlus
在这个网站上我经常用来查各种函数的用法,不要畏惧英文,仔细啃几遍就能看懂,不需要全篇都翻译,坚持一段时间就能看懂的。