【C++】【STL】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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值