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;
    }
  • 相关阅读:
    获取PeopleEditor控件中的用户或用户组
    关于PeopleEditor控件的SelectionSet属性
    SharePoint上禁用列表编辑(上)
    SharePoint上禁用列表编辑(下)
    Windows 7 证书导入工具
    一段奇怪的代码,可以用来检测杀毒软件
    在MyEclipse看到的消息,这应该是不能访问的真正原因了。
    Windows 7 导入证书命令
    Windows Server 2008 R2 Standard DELL OEM
    Netbeans 语言设置
  • 原文地址:https://www.cnblogs.com/wintergrass/p/2028999.html
Copyright © 2011-2022 走看看