一、模板是c++支持参数多态化的工具,使用模板可以使用户为类或者函数声明一种模式,使得类中的某些数据成员或者成员函数的参数、返回值取得 任意类型。
注意:模板的声明或定义只能在全局,命名空间或类范围内进行。即不能在局部范围,函数内进行,比如不能在main函数中声明或定义一个模板。
模板通常有两种形式:函数模板和类模板
1.函数模板
函数模板格式(template和class为关键字,class也用typename替代,效果一样):
<>内指定的参数类型可以选择性地作为函数的参数列表。
例子:
注意:对于函数模板而言不存在 h(int,int) 这样的调用,不能在函数调用的参数中指定模板形参的类型,对函数模板的调用应使用实参推演来进行,即只能进行 h(2,3) 这样的调用,或者int a, b; h(a,b)。
2.类模板
<>中定义的类型可以用于类中定义成员变量和成员函数。
例:
注意:类模板定义对象时需要指明类型,这是和函数模板的使用有区别的地方。
也可以指定模板形参的默认类型:
上述例子的模板形参是类型形参,此外还有非类型形参
非类型形参例子:
二、queue和priority_queue
queue 就是“队列”。队列是先进先出的,和排队类似。队头的访问和删除操作只能在队头进行,添加操作只能在队尾进行。不能访问队列中间的元素。
queue 可以用 list 和 deque 实现,默认情况下用 deque 实现。queue 同样也有和 stack 类似的 push、pop、top 函数。区别在于,queue 的 push 发生在队尾,pop 和 top 发生在队头。
priority_queue 是“优先队列”。它和普通队列的区别在于,优先队列的队头元素总是最大的——即执行 pop 操作时,删除的总是最大的元素;执行 top 操作时,返回的是最大元素的引用。
priority_queue 的第三个类型参数可以用来指定排序规则。
例子: