文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>STL学习之旅二:模板

STL学习之旅二:模板

时间:2011-04-26  来源:冬天的草

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

 

相关阅读 更多 +
排行榜 更多 +
无限Fps

无限Fps

飞行射击 下载
幸存者时间僵尸

幸存者时间僵尸

飞行射击 下载
金属兄弟Metal Brother

金属兄弟Metal Brother

冒险解谜 下载