您的位置:首页 > 编程语言 > C语言/C++

【C++】【STL】STL学习之旅二:模板

2014-10-12 08:13 323 查看
    模板提供了通用的方法来开发可重用代码,可以创建参数化的C++类型。模板可分为:函数模板和类模板。

函数模板的用法同C++预处理器的用法有一定的类似之处,它们都提供编译代码过程中的文本替换功能,但前者可以对类型进行一定的保护。

使用类模板可以编写通用的、类型安全的类。STL中仍然要用到函数模板和类模板。

实例

/*************************************************************************
* *
* 编制动态数组的模板类 *
* *
*************************************************************************/

#include<iostream.h>
template<class T>
class MyArray
{
private:
int m_nTotalSize;//数组总长度
int m_nValidSize;//数组有效长度,即当前数组的最后一个元素下标+1
T* m_pData;//数据
public:
MyArray(int nSize=3)//数组默认总长度为3
{
m_pData=new T[nSize];
m_nTotalSize=nSize;
m_nValidSize=0;
}
~MyArray()
{
if(m_pData!=NULL)//判断是否为空,如果已经释放,则不再释放了。
//避免对同一内存释放两次
{
delete []m_pData;
m_pData=NULL;
}
}
//想m_pData添加数据
void Add(T value)
{
if(m_nValidSize<m_nTotalSize)//如果有效长度小于总长度
{
m_pData[m_nValidSize]=value;
m_nValidSize++;
}
else//有效长度大于总长度,此时要进行数组扩展
{
T* tmpData=new T[m_nTotalSize];//原始数据备份
for(int i=0;i<m_nTotalSize;i++)
{
tmpData[i]=m_pData[i];
}
delete []m_pData;//释放原始数据内存空间
m_nTotalSize=m_nTotalSize*2;//原始数据空间重新分配,空间扩大1倍
m_pData=new T[m_nTotalSize];
//传回备份数据
for(i=0;i<m_nValidSize;i++)
{
m_pData[i]=tmpData[i];
}
delete []tmpData;//释放备份数据内存空间
m_pData[m_nValidSize]=value;
m_nValidSize++;
}
}
//返回数组的有效长度
int GetSize()const
{
return m_nValidSize;
}
//返回某一位置元素
T Get(int pos)const
{
return m_pData[pos];
}
//返回数组
T* GetArray()const
{
return m_pData;
}
};
template<class T>
T sum(T data[],int nSize);

void main()
{
MyArray<int> obj;
obj.Add(1);
obj.Add(2);
obj.Add(3);
obj.Add(4);
for(int i=0;i<obj.GetSize();i++)
{
cout<<obj.Get(i)<<endl;
}
cout<<"数组元素和:"<<sum(obj.GetArray(),obj.GetSize())<<endl;;
}
//函数模板的应用
template<class T>
T sum(T data[],int nSize)
{
T sum=0;
for(int i=0;i<nSize;i++)
sum+=data[i];
return sum;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ stl