手写vector
听课笔记:
vecotr.h头文件:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#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; }
vector.cpp源文件:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#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; }