zoukankan      html  css  js  c++  java
  • 手写vector

    听课笔记:

    vecotr.h头文件:

    #pragma once
    /*写一个容器vector*/
    template<typename T>
    class Myarray
    {
    public:
        Myarray();
        Myarray(int capacity);
        Myarray(const Myarray<T>& arr);//拷贝构造
        T& operator[](int index);//重载【】
        Myarray<T>& operator=(const Myarray<T>& arr);//拷贝赋值
        void PushBack(T& data);
        void PushBack(T&& data);
        //void PushBack(T&& data);
        T& get_mSize();
        ~Myarray();
    
    private:
        int mCapacity;//容量
        int mSize;//当前数组有多少元素,或者说数组的当前大小,容量和大小不一定相同,一般数组容量>=数组大小
        T* pAddr;//数组的首地址
    };
    template<typename T>
    Myarray<T>::Myarray() :mSize(0) { std::cout << std::endl << "!默认构造函数被调用!" << std::endl; }
    template<typename T>
    Myarray<T>::Myarray(int capacity)//构造函数
    {
        mCapacity = capacity;
        mSize = 0;//一般数组在初始化之前,它的大小是0
        pAddr = new int[mCapacity];
    }
    template<typename T>
    T& Myarray<T>::operator[](int index)//重载【】,让vector可以像数组那样用下标索引里面的值
    {
        return  pAddr[index];
    }
    template<typename T>
    void Myarray<T>::PushBack(T& data)//在数组的末尾插入一个元素
    {    //首先判断数组中是否还有剩余的位置,即判断一下数组的当前大小是否小于它的容量,如果小于,证明还没装满,还有空余空间
        if (mSize < mCapacity)
        {
            pAddr[mSize] = data;
            mSize++;//这一句可不能忘记,有了这一句,才能持续的在数组末尾插入新元素
        }
        else
        {
            return;//否则就是没有剩余空间了,打回去,不要再往下执行了
        }
    }
    
    
    template<typename T>
    void Myarray<T>::PushBack(T&& data)//在数组的末尾插入一个元素,括号中是对常量取引用的方法
    {    //首先判断数组中是否还有剩余的位置,即判断一下数组的当前大小是否小于它的容量,如果小于,证明还没装满,还有空余空间
        if (mSize < mCapacity)
        {
            pAddr[mSize] = data;
            mSize++;//这一句可不能忘记,有了这一句,才能持续的在数组末尾插入新元素
        }
        else
        {
            return;//否则就是没有剩余空间了,打回去,不要再往下执行了
        }
    }
    
    
    template<typename T>
    Myarray<T>& Myarray<T>::operator=(const Myarray<T>& arr)//拷贝赋值,让vector可以像数组那样相互赋值,先不返回引用
    {
        if (this->pAddr == arr.pAddr)
        {
            return *this;
        }
        delete[] this->pAddr;
        this->pAddr = new T[arr.mCapacity];
        for (int i = 0; i < arr.mSize; i++)
        {
            pAddr[i] = arr.pAddr[i];
        }
        return *this;
    }
    /*
    template<typename T>
    Myarray<T>::Myarray(const Myarray<T>& arr)//拷贝构造
    {
        if (arr.pAddr != NULL)
        {
            pAddr = new T[arr.mCapacity];
            for (int i = 0; i < arr.mSize; i++)
            {
                pAddr[i] = arr.pAddr[i];
            }
        }
    
        else
        {
            std::cout << std::endl << "传进来的对象的地址为空的话:" << std::endl;
            pAddr = new T[sizeof(T)];
            mSize = 1;
            mCapacity = 1;
            *pAddr = 12;
        }
    
    }
    */
    //拷贝构造的简写版本,因为既然是拷贝构造,那传进来的东西一般是有值的
    template<typename T>
    Myarray<T>::Myarray(const Myarray<T>& arr)//拷贝构造
    {
            pAddr = new T[arr.mCapacity];
            for (int i = 0; i < arr.mSize; i++)
            {
                pAddr[i] = arr.pAddr[i];
            }
    }
    /*
    template<typename T>//这个是网课的写法,貌似没有检测自我赋值
    Myarray<T>& Myarray<T>::operator=(const Myarray<T>& arr)//拷贝赋值,让vector可以像数组那样相互赋值,先不返回引用
    {
        if (this->pAddr != NULL)
        {
            delete[] this->pAddr;
        }
        this->mSize = arr.mSize;
        this->mCapacity = arr.mCapacity;
        this->pAddr = new T[this->mCapacity];
        for (int i = 0; i < this->mSize; i++)
        {
            this->pAddr[i] = arr.pAddr[i];
        }
        return *this;
    }
    */
    template<typename T>
    T& Myarray<T>::get_mSize()
    {
        return mSize;
    }
    template<typename T>
    Myarray<T>::~Myarray()
    {
        if (pAddr != NULL)
            delete[] pAddr;
    }
    View Code

    vector.cpp源文件:

    #include<iostream>
    #include"vector.h"
    using namespace std;
    
    void test01()
    {
        Myarray<int> marray(20);
        Myarray<int> marray1(8);
        int a = 10, b = 20, c = 30, d = 40;
        marray.PushBack(a);
        marray.PushBack(b);
        marray.PushBack(c);
        marray.PushBack(d);
    
        //int e = 11, f = 12, g = 12,h = 14;
        marray1.PushBack(12);
        marray1.PushBack(13);
        marray1.PushBack(14);
        marray1.PushBack(15);
        cout << "marray:  " ;
        for (int i = 0; i < marray.get_mSize(); i++)
        {
            cout << marray[i] << "  ";
        }
        cout << endl;
        cout << "marray1:  " ;
        for (int i = 0; i < marray1.get_mSize(); i++)
        {
            cout << marray1[i] << "  ";
        }
        cout << endl;
    
        marray1 = marray;//检测对象之间拷贝赋值
        cout << "检测拷贝赋值函数(marray1 = marray)-->marray1:  ";
        for (int i = 0; i < marray1.get_mSize(); i++)
        {
            cout << marray1[i] << "  ";
        }
        cout << endl;
    
        Myarray<int> marray2(marray1);//检测拷贝构造函数
        cout << "检测拷贝构造函数(marray2(marray1))-->marray2:  ";
        for (int i = 0; i < marray1.get_mSize(); i++)
        {
            cout << marray2[i] << "  ";
        }
        cout << endl;
    }
    int main()
    {
        test01();
    
        system("pause");
        return 0;
    }
    View Code
  • 相关阅读:
    java:LeakFilling (Linux)
    java:redis(redis安装配置,redis的伪集群配置)
    java:Linux(简单命令,远程ssh使用hostname访问,.免密钥登录配置)
    java:easyui(重点示例)
    任意文件下载漏洞学习
    Centos7 nginx报错403 forbidden
    Centos7 nginx提示错误 Access denied.
    Python问题:UnboundLocalError: local variable 'xxx' referenced before assignment
    PHP载入GIF图像造成服务器宕机(CVE-2018-5711)的漏洞复现
    Python问题:'Nonetype' object is not iterable
  • 原文地址:https://www.cnblogs.com/yibeimingyue/p/10463090.html
Copyright © 2011-2022 走看看