zoukankan      html  css  js  c++  java
  • 模拟标准库vetor类写一个简易的变长整数型数组

    c++标准库中有一个边长数组类vector,为了巩固前面学习的关于运算符重载以及构造函数的知识,在此模拟标准库,自定义一个简易的int型的变长数组类CArray。这个类在效率上存在一定的缺陷,只做学习中。

    #include<iostream>
    #include<cstring>
    using namespace std;
    class CArray{
    private:
        int *ptr;
        int size;
    public:
        CArray(){
            ptr = NULL;
            size = 0;
        }//无参构造函数
        void push_back(int v);//向数组末尾追加元素
        CArray & operator=( CArray& array1);//实现数组对象深拷贝
        int & operator[](int i);//实现通过下标访问数组元素
        int length()const{		//通过成员函数访问数组长度
            return size;
        }   //ok
        CArray(const CArray & array1);//复制构造函数
        ~CArray(){					  //析构函数,释放动态分配内存
            if(ptr){
                delete []ptr;
            }
        }
    };
    
    CArray::CArray( const CArray & array1){
        if(!(array1.ptr)){//如果用来初始化的对象本身就是空的
            (*this).size = 0;
            (*this).ptr=NULL;
        }else{//如果用来初始化的对象本身不是空的
            ptr = new int[array1.size];// 给当前对象分配内存空间,大小与array一样
            memcpy(ptr,array1.ptr,sizeof(int)*array1.size);
            (*this).size = array1.size;
        }
    
    }
    
    CArray & CArray::operator=(CArray& array1){
        if(ptr==array1.ptr){//自己之间的赋值,直接返回
            return *this;
        }
        if(ptr!=NULL){//如果左边原本不是空的,先把左边清空
            delete []ptr;
            ptr=NULL;
            size=0;
        }
        if(array1.ptr==NULL){ //如果右边为空,直接返回
            return *this;
        }else{//如果右边不为空,将右边对象的数据拷贝到左边对象
            ptr = new int[array1.size];//为左边的ptr开辟新的内存空间,大小为array1所指向的大小
            memcpy(ptr,array1.ptr,sizeof(int)*array1.size);//将array1.ptr指向的内存空间的 前x 字节拷贝一份到 ptr指向的内存空间中
            (*this).size=array1.size;
        }
        return *this;
    }
    int& CArray::operator[](int i){
        return ptr[i];
    }
    
    
    void CArray::push_back(int push_data){
        if(ptr){//str之前就已经指向了数据
            int *p = new int[size+1];
            memcpy(p,ptr,sizeof(int)*size);   //1:指针指向的数组之间的拷贝问题。
            delete []ptr;                     //2:ptr指向的是一个int数组,因此应该释放数组
            ptr=p;
        }
        else{//str 之前指向空
            ptr = new int[1];               //这里不能写成new int   因为对应着析构函数,要统一
        }
        ptr[size++]=push_data;              //3:先执行ptr[size]=push_data;再执行size++
    }
    
    
    int main(){ 
        CArray a; //创建一个CArray数组a。  需要定义无参构造函数
        for( int i = 0;i < 5;++i)//向元素末尾存放值    
            a.push_back(i);
        CArray a2,a3;//再创建两个CArrary数组a2,a3
        cout <<"-------test operator=------"<< endl;
        a2 = a; //将数组a赋值给数组a2   测试深拷贝
        for( int i = 0; i < a2.length(); ++i ) //遍历数组a2   
            cout <<a2[i] << " " ;
        cout <<endl<<"---------------------------"<< endl;
    
        cout <<endl<<"-------a2输出应该为空------"<< endl;
        a2 = a3; //a2是空的程序输出结果是:
        for( int i = 0; i < a2.length(); ++i ) //a2.length()返回0
            cout << a2[i] << " ";
        cout <<endl<<"---------------------------"<< endl;
    
        cout <<endl<<"--- test a[3]=100 a4(a)----"<< endl;
        a[3] = 100;                 //修改 3位置的int数  需要重载[]   使其接收一个int型变量(索引),返回值是该位置的引
        CArray a4(a);               //在初始化时,用一个对象初始化另外一个对象。     需要定义复制构造函数
        for( int i = 0; i < a4.length(); ++i )
            cout <<a4[i] << " ";//要做哪些事情?
        cout <<endl<<"---------------------------"<< endl;
    
        return 0;
    }
    
  • 相关阅读:
    PAT (Advanced Level) 1114. Family Property (25)
    PAT (Advanced Level) 1113. Integer Set Partition (25)
    PAT (Advanced Level) 1112. Stucked Keyboard (20)
    PAT (Advanced Level) 1111. Online Map (30)
    PAT (Advanced Level) 1110. Complete Binary Tree (25)
    PAT (Advanced Level) 1109. Group Photo (25)
    PAT (Advanced Level) 1108. Finding Average (20)
    PAT (Advanced Level) 1107. Social Clusters (30)
    PAT (Advanced Level) 1106. Lowest Price in Supply Chain (25)
    PAT (Advanced Level) 1105. Spiral Matrix (25)
  • 原文地址:https://www.cnblogs.com/lasnitch/p/12764273.html
Copyright © 2011-2022 走看看