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;
}

 

你可能感兴趣的:(STL)