在c++中标准模板库主要由容器、算法和其他组件组成,将需要重复利用的功能以模板的形式封装。一般情况下,标准模板库中将算法实现为函数模板,而将容器实现为类模板。
函数模板:使用函数模板可以重写通用函数。
类模板:将类的成员类型参数化。
类模板code:
#include <iostream>
#include <stdio.h>
using namespace std;
/*******************************
**********定义类模板************
*******************************/
template<class T> class Stack
{
public:
Stack(int = 12); //类构造函数
~Stack() //类析构函数
{
delete [] stackPtr;
}
int push(const T&); //入栈
T pop(); //出栈
int isEmpty() const //栈是否为空
{
return top == -1;
}
int isFull() const //栈是否已满
{
return top == size - 1;
}
int getSize() const //获取栈的大小
{
return top + 1;
}
private:
int size; //定义栈的大小
int top; //当前栈的位置
T* stackPtr; //栈的数据指针
};
/*******************************
******实现类模板的成员函数******
*******************************/
template<class T> Stack<T>::Stack(int iSize) //定于构造函数,初始化堆栈的大小
{
size = iSize > 0 && iSize < 100 ? iSize : 12; //默认大小为12
top = -1; //初始化堆栈中没有数据
stackPtr = new T[size]; //为堆栈分配空间
}
template<class T> int Stack<T>::push(const T &item) //入栈函数
{
if(!isFull()) //判断是否已满
{
stackPtr[++top] = item; //入栈
return 1; //返回成功
}
return 0; //否则返回失败
}
template<class T> T Stack<T>::pop() //出栈函数
{
if(!isEmpty()) //判断是否为空
{
T item = stackPtr[top--]; //出栈
return item; //返回成功
}
return -1; //否则返回失败
}
/*******************************
*********实例化类模板***********
*******************************/
int main(int argc, char* argv[])
{
typedef Stack<int> StackInt;
StackInt s;
for (int i = 0;i < 16;i++)
{
if(s.push(i) != 1)
{
cout << "添加第" << i+1 << "个元素时失败" << endl;
break;
}
}
int iCount = s.getSize();
cout << "堆栈中有" << iCount << "个元素" << endl;
while(!s.isEmpty())
{
cout << s.pop() <<endl;
}
}
函数模板:
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
/*******************************
*********定义函数模板***********
*******************************/
template <class T> T mint(T a,T b)
{
return a < b ? a : b;
}
/*******************************
**********模板具体化************
*******************************/
char* mint(char* a, char* b)
{
return strcmp(a,b) < 0 ? a : b;
}
/*******************************
*********使用函数模板***********
*******************************/
int main(int argc, char* argv[])
{
//调用函数模板取最小整数值
cout << mint(1234, 2345) << endl;
//调用函数模板取最小符号值
cout << mint('a', 'c') << endl;
//调用函数模板取最小浮点值
cout << mint(123.5, 32.5) << endl;
//调用函数模板取最小字符串值
cout << mint("Smith", "Jordan") << endl;
return 0;
}