模板的理解
开发工具与关键技术:Visual Studio、C++
作者:张国军
撰写时间:2019年06月03日
模板把函数或类要处理的数据类型参数化,表现为参数的多态性,称为类属。
模板用于表达逻辑结构相同,但具体数据元素类型不同的数据对象的通用行为。
类属 —— 类型参数化,又称参数模板
使得程序(算法)可以从逻辑功能上抽象,把被处理的对象(数据)类型作为参数传递
C++提供两种模板机制:函数模板、类模板
声明模板中使用的类属参数。形式为: template < 类型形式参数表 >
template < typename T >
template < class T >
函数模板声明:
template < 类型形式参数表 >
类型 函数名 ( 形式参数表 )
{
语句序列
}
函数模板定义由模板说明和函数定义组成
模板说明的类属参数必须在函数定义中至少出现一次
函数参数表中可以使用类属类型参数,也可以使用一般类型参数 。
那么我们下边来看一个函数模板的例子:
这个例子是一个选择排序的模板,我们都知道排序跟我们容器里面装的什么元素并没有太大的影响所以我们可以使用模板进行使用。
#include <time.h>
#include <iostream>
using namespace std;
template <typename ElementType >
void SortSelect(ElementType * a, int size) {
int work;
for (int i = 0; i < size-1; i++)
{
work = i;
for (int j = i+1; j < size; j++)
{
if (a[j] > a[work]) {
work = j;
}
}
if (work != i) {
ElementType temp = a[i];
a[i] = a[work];
a[work] = temp;
}
}
}
template <typename ElementType >
void show(ElementType * a, int size) {
for (int i = 0; i < size; i++)
{
cout << a[i] << " ";
}
cout << endl;
}
void main() {
int a[10];
srand(time(0));
for (int i = 0; i < 10; i++)
{
a[i] = rand() % 100;
}
show(a, 10);
SortSelect(a, 10);
show(a, 10);
}
我这里主要是进行了降序排序,声明的 通过数组获取元素给到我们的函数模板,系统会根据我们的数组类型进行分配对应函数模板,然后进行调用。
当我们调用的并不是我们写的模板函数,从这里我们可以看得出来,调用的是void SortSelect(int*a,int size)这个函数,这个函数呢我们并没有写,而是系统通过我们函数模板进行衍生出来的,所以我们只需要写一个模板可以通过系统帮我们转换就行了。
但是,也不是什么时候都能使用模板,那就得看我们在于什么情况了。
那么我们下边来看一看类模板。
类模板用于实现类所需数据的类型参数化
类模板在表示如数组、表、图等数据结构显得特别重要,
这些数据结构的表示和算法不受所包含的元素类型的影响
类模板由模板说明和类说明构成
template <类型形式参数表> 类声明
例如:
template< typename Type >
class TClass
{ // TClass的成员函数
private :
Type DateMember ;
//…
};
类属参数必须至少在类说明中出现一次
我们来看一个例子:这个例子是写一个链表的类模板,那么我们看一下
#include <time.h>
#include <iostream>
using namespace std;
template <typename ElementType >
class StencilChain {
public:
StencilChain();
ElementType data;
StencilChain *next;
};
template <typename ElementType >
StencilChain<ElementType>::StencilChain<ElementType>() {
next = NULL;
}
template <typename ElementType >
void show(StencilChain<ElementType> *head) {
while (head)
{
cout << head->data << " ";
head = head->next;
}
cout << endl;
}
void main() {
StencilChain<int> * head=NULL;
StencilChain<int> * p = NULL;
StencilChain<int> * s = NULL;
int a;
cin >> a;
while (a)
{
s=new StencilChain<int>;
s->data = a;
if (head == NULL) {
head = s;
}
else
{
p = head;
while (p->next)
{
p = p->next;
}
p->next = s;
}
cin >> a;
}
show(head);
}
我将它data数据进行了不定类型,我们的指针并没有变,所以呢用法上跟我们一般的链表也差不多
至于它的输出显示,就跟我们的模板函数没什么区别了。
至于各位需要用在什么地方呢,那就看各位的用途了。