可改变长度的数组

//编写可变长整形数组类
#include
using namespace std;
class carray{
    int size;//数组元素的个数
    int *ptr;//指向动态分配的数组
    public:
    carray(int s=0);//构造函数,s代表数组元素个数
    carray(carray & a);//复制构造函数
    ~carray();//析构函数
    void push_back(int v);//在数组尾部添加一个元素
    int length(){//返回数组元素个数
        return size;
    }
    int & carray::operator[](int i){
        //用以支持根据下标访问数组元素
        //如n=a[i]和a[i]=4;
        return ptr[i];
    }
};
int main(){
    carray a;//开始时数组为空
    for(int i=0;i<5;++i){
        a.push_back(i);
    }
    carray a2,a3;
    a2=a;
    for(int i=0;i<a2.length();++i){
        cout<<a2[i]<<" ";
    }
    a2=a3;
    for(int i=0;i<a2.length();i++){
        cout<<a2[i]<<" ";
    }
    cout<<endl;
    a[3]=100;
    carray a4(a);
    for(int i=0;i<a4.length();i++){
        cout<<a4[i]<<" ";
    }
    return 0;
}
carray::carray(int s):size(s){
    if(s==0) 
        ptr=NULL;
    else
        ptr=new int[s];
}
carray::carray(carray & a){
    if(!a.ptr){
        ptr=NULL;
        size=0;
        return;
    }
    ptr=new int[a.size];
    memcpy(ptr,a.ptr,sizeof(int)*a.size);
    size=a.size;
}
carray::~carray(){
    if(ptr) delete []ptr;
}
carray & carray::operator=(const carray & a){
    if(ptr==a.ptr)
        return * this;
    if(a.ptr==NULL){
        if(ptr) delete [] ptr;
        ptr=NULL;
        size = 0;
        return * this;
    }
    if(size<a.size){//如果原有空间足够大,就不用分配新的空间
        if(ptr) delete []ptr;
        ptr=new int [a.size];
    }
    memcpy(ptr,a.ptr,sizeof(int)*a.size);
    size=a.size;
    return *this;
}
void carray::push_back(int v){
    if(ptr){
        int *tmpptr=new int[size+1];//重新分配存储空间
        memcpy(tmpptr,ptr,sizeof(int)*size);
        delete []ptr;
        ptr=tmpptr;
    }
    else
        ptr=new int [1];
    ptr[size++]=v;
}

你可能感兴趣的:(c++)