14.可变长数组的实现

1.要编写可变长数组类,使之能够如下使用

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<a.length();i++)
         cout<<a2[i]<<"" ;
     a2=a3;
     for(int i=0;i<a2.lengh();++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;                 
}

2.细节实现

class carray
{
    int size;//数组元素的个数
    int *ptr;//指向动态分配的数组
    public:
        carray(int s=0);//s代表数组元素的个数
        carray(carray &a);
        ~carray();
        void push_back(int v);//用于在数组尾巴添加一个元素v
        carray & operator =(const carray &a);//勇于数组对象间的赋值
        int length(){return size;}//返回数组元素个数
        int &carray::operator[](int i)//返回值为int不行!不支持a[i]=4
        {//用于支持根据下标访问数组元素,如n=a[i]和a[i]=4这样的语句。
            return ptr[i];
        };
}
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;
        retrun *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;  //加入新的数组元素    
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值