一、 模板介绍
1.函数模板的原理
(a )每一次使用一个新类型去调用模板,编译器内部都按照该类型生成新类型的函数
(b )这个生成新的具体类型函数的过程叫做模板的实例化
(c )每有一个新的模板实例化,d等于内部新增加了一个函数,编译尺寸会变大
2.类模板
(a )类模板的实例化过程和函数模板一样,也是根据调用类型实例化生成新的一个类
(b )类成员函数外编写需要重新指定:template <class T .>同时定义域前类名后带< T .>
(c )类模板如果是在同文件中声明,函数体也必须在头文件中编写
(d )可以使用关键字typename代替class
二、栈和队列模板化实现
1.栈
//Stack.h
#pragma once
template <typename DATA>
class Stack
{
DATA *m_pData;
int m_nTop;
int m_nCount;
public:
Stack(int nCount=10):m_nTop(-1)
{
m_pData = new DATA[nCount];
m_nCount = nCount;
}
~Stack()
{
delete[]m_pData;
}
void push(const DATA& data)
{
if(!isFull())
m_pData[++m_nTop] = data;
}
bool isFull()
{
return m_nTop + 1 >= m_nCount;
}
bool IsEmpty()
{
return m_nTop == -1;
}
bool pop(DATA &data)
{
if (IsEmpty())
return false;
data = m_pData[m_nTop--];
return true;
}
};
2.队列
//Queue.h
#pragma once
template<typename DATA>
class CQueue
{
DATA *m_pData;
int m_nCount;
int m_nHead, m_nTail;
public:
CQueue(int nCount = 5);
~CQueue()
{
delete[]m_pData;
}
bool isFull()
{
return (m_nTail + 1)%m_nCount == m_nHead;
}
void push(const DATA& data);
bool IsEmpty()
{
return m_nHead == m_nTail;
}
bool pop(DATA& data);
};
template<typename DATA>
CQueue<DATA>::CQueue(int nCount)
{
m_nHead = m_nTail = 0;
m_nCount = nCount + 1;
m_pData = new DATA[m_nCount];
}
template<typename DATA>
void CQueue<DATA>::push(const DATA& data)
{
if (isFull())
return;
m_pData[m_nTail] = data;
m_nTail = (m_nTail + 1) % m_nCount;
}
template<typename DATA>
bool CQueue<DATA>::pop(DATA& data)
{
if (IsEmpty())
return false;
data = m_pData[m_nHead];
m_nHead = (m_nHead + 1) % m_nCount;
return true;
}