STL学习之旅二:模板

模板提供了通用的方法来开发可重用代码,可以创建参数化的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;
}

 

posted on 2011-04-26 10:45  COS  阅读(243)  评论(0编辑  收藏  举报