zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    Running ASP.NET Applications in Debian and Ubuntu using XSP and Mono
    .net extjs 封装
    ext direct spring
    install ubuntu tweak on ubuntu lts 10.04,this software is created by zhouding
    redis cookbook
    aptana eclipse plugin install on sts
    ubuntu open folderpath on terminal
    ubuntu install pae for the 32bit system 4g limited issue
    EXT Designer 正式版延长使用脚本
    用 Vagrant 快速建立開發環境
  • 原文地址:https://www.cnblogs.com/wintergrass/p/2028999.html
Copyright © 2011-2022 走看看