模擬實現Vector
阿新 • • 發佈:2018-11-11
Vector模擬實現,具體的Vector描述請檢視https://blog.csdn.net/weixin_40853073/article/details/81413281
#include<iostream> #include<stdio.h> #include<assert.h> using namespace std; #pragma once typedef int DataType; class Vector { public: Vector()//使用初始化列表初始化 :_first(NULL)//相當於線性表的陣列名 , _finish(NULL)//相當於線性表的元素個數 , _endofstorage(NULL)//相當於線性表的容量 {} Vector(const Vector& v)//拷貝構造 { _first = new DataType[v.Size()];//開闢一個新的_first,為他開闢大小為_finish的空間 _finish = _first + v.Size(); _endofstorage = _first + v.Size(); memcpy(_first, v._first, sizeof(DataType)*v.Size()); } //v1=v2 Vector& operator=(Vector& v)//賦值過載的現代寫法 { swap(_first, v._first); swap(_finish, v._finish); swap(_endofstorage, v._endofstorage); return *this;//v是區域性物件,出了作用域釋放 } DataType& operator[](size_t pos) { return _first[pos]; } ~Vector()//解構函式 { if (_first) { delete[] _first;//開闢的陣列需要釋放 _first = _finish = _endofstorage = NULL; } } size_t Size() const { return _finish - _first;//元素個數 } size_t Capacity() const { return _endofstorage - _first;//容量 } void PushBack(DataType x)//尾插 { if (_finish == _endofstorage)//首先判斷是否需要擴容 { size_t newcapacity = Capacity() > 0 ? Capacity() * 2 : 3;//最初容量為0時,直接把容量賦值為3;當容量不為0時增容*2 Expand(newcapacity); } *_finish = x; ++_finish; } void PopBack()//尾刪 { assert(_finish > _first); --_finish; } void Insert(size_t pos, DataType x)//在指定位置插入數字 { if (pos > Size()) { printf("錯誤的插入地點"); } else { DataType end = Size()-1;//end為陣列的最後一個位置 if (_finish == _endofstorage)//判斷是否擴容 { Expand(end*2); } while (end > pos-1)//迴圈後移 { _first[end + 1] = _first[end]; end--; } _first[pos] = x; _finish++; } } void Erase(size_t pos)//刪除指定位置的數字 { if (pos > Size()) { printf("錯誤的位置"); } else { size_t end = Size() - 1; while (pos < end) { _first[pos] = _first[pos + 1];//迴圈前移 pos++; } _finish--; } } size_t Find(DataType x)//查詢數字是否存在 { size_t tmp = Size() - 1; size_t i = 0; for (i = 0; i <= tmp; i++) { if (_first[i] == x) { printf("找到了,這個數是 %d \n", _first[i]); return 0; } } printf("沒找到\n"); return -1; } private: void Expand(size_t n)//擴容 { if (n > Capacity()) { size_t size = Size(); size_t capacity = Capacity(); DataType*tmp = new DataType[n]; memcpy(tmp, _first, Size()*sizeof(DataType)); delete[] _first; _first = tmp; _finish = _first + size; _endofstorage = _first + n; } } DataType* _first; DataType* _finish;//最後一個的下一個 DataType* _endofstorage;//capcity的下一個 }; int main() { Vector v1; v1.PushBack(1); v1.PushBack(2); v1.PushBack(3); v1.PushBack(4); v1.PushBack(5); v1.PushBack(6); v1.Insert(3, 7); v1.Insert(3, 7); v1.Insert(3, 7); v1.Insert(3, 7); v1.Insert(3, 7); v1.Insert(3, 7); v1.Insert(3, 2); v1.Insert(3, 22); v1.Erase(3); v1.Find(77); v1.PopBack(); //Vector v2; //v2 = v1;//賦值過載 //Vector v2(v1);//拷貝構造 for (size_t i = 0; i < v1.Size(); i++)//列印 { cout << v1[i] << " "; } cout << endl; system("pause"); return 0; }