C++类模板(二)用类模板实现可变长数组

#include <iostream>
#include <cstring>
using namespace std;
template <class T> class CArray{
    int size ; //数组元素的个数
    T *ptr;

public:
    CArray(int s=0);//数组元素的个数
    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];
    }
};

template <class T>CArray<T>::CArray(int s ):size(s) {
    if (s==0)
        ptr=NULL;
    else
        ptr =new T[s];
}

template <class T>
CArray<T>::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;
}

template <class T>

CArray<T>::~CArray(){

    if (ptr) delete [] ptr ;
}

template <class T>
CArray<T> &CArray<T>::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;

}
template <class T>
void CArray<T>::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()
{
    CArray<int >a ;
    for (int i =0 ;i<5;++i)
        a.push_back(i);
    for (int i=0;i<a.length();++i)
        cout <<a[i]<<" ";
    return 0;
}
0 1 2 3 4 
posted @   luoganttcc  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示