C++學習總結——vector容器的實現
阿新 • • 發佈:2019-02-19
//myvector.h #pragma once template<class T> class myvector { public: myvector(); ~myvector(); void push_back(T t); T* find(T t); void show(); void change(T* pos, T t); void del(T t); void insert(int pos,T t); T operator [](int i); public: T* p; int n; int reallen; }; //myvector.cpp #include "myvector.h" #include <iostream> using namespace std; /* myvector(); ~myvector(); void push_back(T t); T *find(T t); void show(); void change(T *pos, T t); void del(T t); void insert(T *pos,T t); */ template<class T> myvector<T>::myvector() { p = nullptr; n = reallen = 0; } template<class T> myvector<T>::~myvector() { if (p != nullptr) { delete[]p; n = reallen = 0; } } //從尾部插入資料 template<class T> void myvector<T>::push_back(T t) { if (p == nullptr) { p = new T; *p = t; n = reallen = 1; } else { T* ptemp = new T[n + 1]; for (int i = 0;i < n;i++) { ptemp[i] = p[i]; } delete[]p; p = ptemp; p[n] = t; reallen += 1; n += 1; } } //查詢資料元素返回位置 template<class T> T* myvector<T>::find(T t) { for (int i = 0;i < reallen;i++) { if (p[i] == t) { return p + i; } } return nullptr; } //列印資料元素 template<class T> void myvector<T>::show() { if (p == nullptr) { return; } for (int i = 0;i < reallen;i++) { cout << "p[" << i<<"]="<<p[i] << endl; } } //改變資料元素 template<class T> void myvector<T>::change(T *pos, T t) { if (pos == nullptr) { return; } else { *pos = t; } } //刪除資料 template<class T> void myvector<T>::del(T t) { int pos = -1; for (int i = 0;i < reallen;i++) { if (p[i] == t) { pos = i; break; } } if (pos != -1) { if (pos == reallen - 1) { reallen -= 1; } else { for (int i = pos;i < reallen - 1;i++) { p[i] = p[i + 1]; } } } } //插入資料 template<class T> void myvector<T>::insert(int pos, T t) { if (pos>0 && pos<= n) { //重新分配記憶體並拷貝 T *ptemp = new T[n + 1];//重新分配記憶體 for (int i = 0; i < n; i++) { *(ptemp + i) = *(p + i);//拷貝 } delete []p; p = ptemp; reallen += 1; n += 1; } for(int i = reallen-2;i>=pos;i--) { p[i+1] = p[i];//往前移動 } p[pos] = t; } //過載操作符 template<class T> T myvector<T>::operator[](int i) { if (i < 0 || i >= reallen) { return NULL; } return p[i]; } //main.cpp #include "myvector.h" #include "myvector.cpp"//模板需包含實體 #include<iostream> using namespace std; void main() { myvector<int> myv; myv.push_back(12); myv.push_back(15); myv.push_back(13); myv.push_back(10); myv.insert(2,9); cout<<myv.find(12)<<endl; myv.change(myv.find(13),8); myv.show(); cin.get(); }