通过模板初识STL思维

 

 

同学们都在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容器关于内存“动态分配、销毁、再分配的思想了,也就是把与内存管理的一部分进一步抽象,编程系统代码,应用方不必明白内存是如何变化的,用专家级编写的代码,而不是自己编写的代码来管理内存

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值