//用模板类实现一个动态数组。
#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;
}