需求:
写一个可变长度的数组类Array
用途于存放若干元素,个数未知
设计:
内部动态申请一个buffer
capacity:表示buffer的大小
size:表示buffer中已经存放元素的个数
class Array
{
public:
Array(int capacity=16)
{
m_buffer=new double[capacity];
m_capacity=capacity;
m_size=0;
}
void PushBack(double val)
{
if(m_size >=m_capacity)
{
Resize();
}
m_buffer[m_size]=val;
m_size++;
}
int Capacity()
{
return m_capacity;
}
private:
void Resize()
{
//创建一个更大的缓冲区
int n=m_capacity + 16;
double *buf=new double[n];
//拷贝原有的内容
memcpy(buf,m_buffer,m_capacity);
//删除旧的内容,释放其内容
delete [] m_buffer;
//更新一下成员变量
m_capacity=n;
m_buffer=buf;
}
private:
double * m_buffer;
int m_capacity;//容量
int m_size;//已经存放的对象的个数
};
int main()
{
Array a;
a.PushBack(1);
a.PushBack(2);
a.PushBack(3);
a.PushBack(4);
a.PushBack(5);
}
接口:
Size();得到当前一个有多个元素
Capacity();最大容量
Clear();清空,使size为0,capacity不变
PushBack():附加一个元素
重载操作符():返回第几个元素(像数组一样操作它)
问题:这个类只适用于存放double型元素,如果要存放clear,float,int,以至于任意类型呢?
类模板
template <typename T>
class Array
{
};
使用类模板,就可以适用于不同元素类型,避免创建很多个类型的类。
否则,要为每种类型创建一个类,例如:IntArray,DoubleArray……
使用方法:
Array arr(4);//创建array,初始capacity为4
可以把Array合起来看成一个类名
使用这个对象的方法和普通对象没有特别之处:
arr.PushBack(123);
arr.PushBack(456);
int size=arr.Size();
arr[0]=100;
模板的定义通常放在头文件里面