手写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
原文地址:https://www.cnblogs.com/yibeimingyue/p/10463090.html