同学们都在C++中学习过模板技术,那么是否与STL模板技术不一样呢?其实STL并不是特别的神秘,用到的也不是新技术,通过下面的例子加以说明。
#include "stdafx.h"
#include <iostream>
using std::cout;
using std::endl;
template <class Type>
class MyArray
{
private:
int m_nTotalSize; //数组总长度
int m_nValidSize; //数组有效长度
Type *m_pData; //数据
public:
MyArray(int nSize = 3)
{
m_pData = new Type[nSize];
m_nTotalSize = nSize;
m_nValidSize = 0;
}
void Add(Type value) //向m_pData添加数据
{
if ( m_nValidSize < m_nTotalSize) //如果有效长度小于总长度
{
m_pData[m_nValidSize] = value; //赋值
m_nValidSize++; //有效长度加1
}
else //如果有效长度大于总长度
{
//原始数据备份
Type * TempData = new Type[m_nTotalSize];
for (int i = 0 ; i < m_nTotalSize ; i++)
{
TempData[i] = m_pData[i];
}
delete [] m_pData; //释放原始数据的内存空间
m_nTotalSize *= 2; //原始数据空间重新分配,空间扩大一倍
m_pData = new Type[m_nTotalSize]; //传回备份原始数据
for ( i = 0 ; i < m_nValidSize ; i++)
{
m_pData[i] = TempData[i];
}
delete [] TempData;
m_pData[m_nValidSize] = value;
m_nValidSize++;
}
}
int GetSize() //返回数组有效长度
{
return m_nValidSize;
}
Type Get(int pos) //返回某一位置元素
{
return m_pData[pos];
}
virtual ~MyArray()
{
delete [] m_pData;
m_pData = NULL;
}
};
int main(int argc, char* argv[])
{
MyArray<int>obj;
obj.Add(1);
obj.Add(2);
obj.Add(3);
obj.Add(4);
for (int i = 0 ; i < 4 ; i++)
{
cout << obj.Get(i) << endl;
}
return 0;
}
解释:
默认构造函数分配一个大小为3个元素的数组指针m_pData,然后通过Add函数向其中添加4个元素,最后完成动态数组元素的显示m_pData仅包含3个空间,却添加了4个元素,仔细分析代码的绿颜色部分,就可以明白其中的道理。当添加三个元素时,m_pData的内存空间没有变化,当添加第四个元素时,m_pData已经没有多余的空间容纳数据啦, 则把m_pData中的数据先保存在TempData中,再销毁m_pData指向的空间,重新分配m_pData内存空间,大小是原来的2倍,由3变为6,之后把TempData中的数据再复制到m_pData的空间中,最后把第四个元素添加到m_pData中。由此可以退出,当添加7个元素时,m_pData的空间有6变为12;当添加13个元素时,有12变为24,以此类推。这样代码就实现了动态数组的生成。本例已经体现了STL容器关于内存“动态分配、销毁、再分配的思想了,也就是把与内存管理的一部分进一步抽象,编程系统代码,应用方不必明白内存是如何变化的,用专家级编写的代码,而不是自己编写的代码来管理内存