用类模板实现可变长数组:
创新互联公司是一家集网站建设,临洮企业网站建设,临洮品牌网站建设,网站定制,临洮网站建设报价,网络营销,网络优化,临洮网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。#include#includeusing namespace std;
templateclass CArray
{int size; //数组元素的个数
T *ptr; //指向动态分配的数组
public:
CArray(int s = 0); //s代表数组元素的个数
CArray(CArray & a);
~CArray();
void push_back(const T & v); //用于在数组尾部添加一个元素v
CArray & operator=(const CArray & a); //用于数组对象间的赋值
T length() {return size; }
T & operator[](int i)
{//用以支持根据下标访问数组元素,如a[i] = 4;和n = a[i]这样的语句
return ptr[i];
}
};
templateCArray::CArray(int s):size(s)
{ if(s == 0)
ptr = NULL;
else
ptr = new T[s];
}
templateCArray::CArray(CArray & a)
{if(!a.ptr) {ptr = NULL;
size = 0;
return;
}
ptr = new T[a.size];
memcpy(ptr, a.ptr, sizeof(T ) * a.size);
size = a.size;
}
templateCArray::~CArray()
{ if(ptr) delete [] ptr;
}
templateCArray& CArray::operator=(const CArray & a)
{//赋值号的作用是使"="左边对象里存放的数组,大小和内容都和右边的对象一样
if(this == & a) //防止a=a这样的赋值导致出错
return * this;
if(a.ptr == NULL) {//如果a里面的数组是空的
if( ptr )
delete [] ptr;
ptr = NULL;
size = 0;
return * this;
}
if(size< a.size) {//如果原有空间够大,就不用分配新的空间
if(ptr)
delete [] ptr;
ptr = new T[a.size];
}
memcpy(ptr,a.ptr,sizeof(T)*a.size);
size = a.size;
return *this;
}
templatevoid CArray::push_back(const T & v)
{//在数组尾部添加一个元素
if(ptr) {T *tmpPtr = new T[size+1]; //重新分配空间
memcpy(tmpPtr,ptr,sizeof(T)*size); //拷贝原数组内容
delete []ptr;
ptr = tmpPtr;
}
else //数组本来是空的
ptr = new T[1];
ptr[size++] = v; //加入新的数组元素
}
int main()
{CArraya;
for(int i = 0;i< 5;++i)
a.push_back(i);
for(int i = 0; i< a.length(); ++i)
cout<< a[i]<< " ";
return 0;
注意:push_back()函数的实现,不是单纯的在数组末尾+1,而是要从新申请空间,要不造成越界
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧