template mylist

//用模板类实现一个动态数组。
#include "stdafx.h"
#include "string.h"
#include <malloc.h>

template<typename T>
class list
{
private:
 T *data;
 size_t size;
 size_t capacity;
public:
 list();
 ~list();
 list(const list &ls);
 int push_back(T);
 T pop_head(); 
 T &operator[](size_t index);
 list &operator=(const list<T> &ls);
 bool operator ==(const T t1);
};

template<typename T>
list<T>::list()
{
 size = 0;
 capacity = 1;
 data = new T[sizeof(T)];  //建立类型指什,能放下一个类型就够了
}

template<typename T>
list<T>::list(const list<T> &rl)
{
 data = new T[rl.capacity * sizeof(T)];
 memcpy(data, rl.data, rl.capacity * sizeof(T));
 size = rl.size;
 capacity = rl.capacity;
}

template<typename T>
list<T>::~list()
{
 delete []data;
}

template<typename T>
list<T> &list<T>::operator=(const list<T> &rs)
{
 if(this != &rs) //对比地址
 {
  delete []this->data;
  data = new T[sizeof(T) * rs.capacity]; //类型大小乘以容量
  size = rs.size;
  capacity = rs.capacity;
  memcpy(data, rs.data, sizeof(T) * rs.capacity);
 }
 return *this;
}

template<typename T>
T &list<T>::operator[](size_t index)
{
 if(index<0 || index>size)
  throw "范围溢出!";
 
 else
  return data[index];
}

template<typename T>
int list<T>::push_back(T t)
{

 int deta = 0;
 if(capacity ==size) //提前申请,算法优化
 {
  if (capacity >64)
     deta = capacity /4;
  else if(capacity>8)
     deta = 8;
  else
        deta = 4;
 
  capacity += deta;
  T *temp = new T[size * sizeof(T)]; 
  memcpy(temp, data, size * sizeof(T));//保存原来的值到临时变量中

  delete []data; 
  data = new T[capacity * sizeof(T)];
  memcpy(data, temp, size * sizeof(T)); //还原原来的数据
  delete []temp;
 }

 if(data)
 {
  data[size] = t;
  ++size;
  return size;
 }
 else
  return 0;
}

int main(int argc, char* argv[])
{
 list<char*> l1;
 char *a = "aaaa";
 l1.push_back(a);
 a = "bbbb";
 l1.push_back(a);
 a = "cccc";
 l1.push_back(a);
 try
 {
  printf("f1= %s/n", l1[2]);
 }
 catch(char *a)
 {
  printf("throw =%s/n", a);
 }


 list<int> iList;
 iList.push_back(10);
 iList.push_back(20);
 iList.push_back(30);
 int k = iList[2];
 printf("k=%d", k);


 return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值