轉載自: https://www.ev0l.art/index.php/archives/22/php
使用模板類實現。底層爲數組實現。ios
#ifndef DVECTOR_H #define DVECTOR_H #pragma once #include <iostream> template <class T> class dvector { public: dvector(); ~dvector(); bool push_back(T); void show(); public: T* p; int len; int real_len; }; #endif // DVECTOR_H
#include "dvector.h" template <class T> dvector<T>::dvector() { len=real_len =0; p=nullptr; } template<class T> dvector<T>::~dvector() { if(p!=nullptr) { delete []p; p=nullptr; } } template <class T> void dvector<T>::show() { if(p!=nullptr) { for(int i=0;i<real_len;i++){ std::cout<<i<<"\t"<<*(p+i)<<std::endl; } std::cout<<"length="<<real_len<<std::endl; }else { std::cout<<"NNNNNNNNNNNNNNNNNNNNNNNNNNo thing"<<std::endl; } } template<class T> bool dvector<T>::push_back(T t){ if(p==nullptr) { //第一個爲空說明只有一個元素 p=new T; *p=t; real_len=len=1; }else { //第一個不爲空說明有多個元素,這時候鏈表就必須從新分配內存 //分配爲數組形式 T *ptemp = new T[real_len+1]; for(int i=0;i<real_len;i++) { *(ptemp+i)=*(p+i); } *(ptemp+real_len)=t; delete []p; p=ptemp; real_len+=1; len+=1; } return true; } int main() { //測試基本類型 //string 會出錯,由於string 不是基本類型,是一種相似 vector 的類模板,其內部的內存操做與基本類型不同。 //1. int dvector<int>* dv1=new dvector<int>; dv1->push_back(12); dv1->push_back(15); dv1->push_back(1995); dv1->push_back(200); dv1->push_back(2); dv1->push_back(1); dv1->show(); //2. double dvector<double>* dv2=new dvector<double>; dv2->push_back(12.2); dv2->push_back(15.3); dv2->push_back(1995.0220); dv2->push_back(200.1); dv2->push_back(2.3); dv2->push_back(1.9); dv2->show(); //3. char* dvector<char*>* dv3=new dvector<char*>; dv3->push_back("nimei"); dv3->push_back("de"); dv3->push_back("垃圾"); dv3->push_back("95"); dv3->push_back("lalala"); dv3->push_back("45"); dv3->show(); return 0; }
- 和尹成老師視頻裏面寫的不同。。本身寫的。反正就是不規範就是了
#ifndef DVECTOR_H #define DVECTOR_H #pragma once #include <iostream> template <class T> class dvector { public: dvector(); ~dvector(); bool push_back(T); bool del(T); bool modify(T, T); int search(T t); void show(); public: T* p; int len; int real_len; }; #endif // DVECTOR_H
#include "dvector.h" using namespace std; template <class T> dvector<T>::dvector() { len=real_len =0; p=nullptr; } template<class T> dvector<T>::~dvector() { if(p!=nullptr) { delete []p; p=nullptr; } } //遍歷輸出 template <class T> void dvector<T>::show() { if(p!=nullptr) { for(int i=0;i<real_len;i++){ std::cout<<i<<"\t"<<*(p+i)<<std::endl; } std::cout<<"length="<<real_len<<std::endl; }else { std::cout<<"NNNNNNNNNNNNNNNNNNNNNNNNNNo thing"<<std::endl; } } //增 template<class T> bool dvector<T>::push_back(T t){ if(p==nullptr) { //第一個爲空說明只有一個元素 p=new T; *p=t; real_len=len=1; }else { //第一個不爲空說明有多個元素,這時候鏈表就必須從新分配內存 //分配爲數組形式 T *ptemp = new T[real_len+1]; for(int i=0;i<real_len;i++) { *(ptemp+i)=*(p+i); } *(ptemp+real_len)=t; delete []p; p=ptemp; real_len+=1; len+=1; } return true; } //查 返回查找到的序號 template <class T> int dvector<T>::search(T t) { if (p ==nullptr) { std::cout << "The dvector is empty ,abort!" << std::endl; return false; } else { for (size_t i = 0; i < real_len; i++) { if (*(p+i) == t) { cout << "FIND " << t << "at the position of " << i<<" " << endl; return i; } } cout << "no such a thing" << endl; return -1; } return -1; } //刪 template <class T> bool dvector<T>::del(T t) { if (p == nullptr) { std::cout << "The dvector is alreafy empty ,abort!" << std::endl; return false; } else { for (size_t i = 0; i < real_len; i++) { if (*(p + i) == t) { cout << "Deleting" << endl; cout << "FIND " << t << "at the position of " << i << " " << endl; //若是是在第一個的狀況 if (i == 0) { for (size_t i = 0; i < real_len; i++) { if (real_len == 1) //若是是隻剩一個並且恰好第一個是要刪除的 { delete p; p == nullptr; real_len -= 1; return true; } else { //還有多個且第一個是要刪除的 T* tmp = new T[real_len - 1]; for (size_t k = 0; k < real_len-1; k++) { *(tmp + k) = *(p + k + 1); } delete[]p; p = tmp; real_len -= 1; return true; } } } else if (i== real_len-1) //最後一個匹配要刪除的時候 { p + i == nullptr; real_len -= 1; } else //在中間的狀況 { T* tmp = new T[real_len - 1]; for (size_t k = 0; k < i ; k++) { *(tmp + k) = *(p + k); } // 利用兩個循環恰好跳過下標爲i 的值 k 爲原來的p 中的值,tmp+k-i 爲新數組中的下標 for (size_t k = i+1; k < real_len; k++) { *(tmp + k - 1) = *(p + k); } delete[]p; p = tmp; real_len -= 1; return true; } } } cout << "no such a thing,Delete failed!" << endl; return false; } } //改 template <class T> bool dvector<T>::modify(T origin, T mo) { if (p == nullptr) { std::cout << "The dvector is empty ,abort!" << std::endl; return false; } else { for (size_t i = 0; i < real_len; i++) { if (*(p + i) == origin) { cout << "Modifying" << endl; cout << "FIND " << origin << "at the position of " << i << " " << endl; *(p + i) = mo; } } cout << "no such a thing ,Modify failed!" << endl; return false; } return -1; } int main() { //測試基本類型 //string 會出錯,由於string 不是基本類型,是一種相似 vector 的類模板,其內部的內存操做與基本類型不同。 //1. int dvector<int>* dv1=new dvector<int>; dv1->push_back(12); dv1->push_back(15); dv1->push_back(1995); dv1->push_back(200); dv1->push_back(2); dv1->push_back(1); dv1->show(); //dv1->search(200); //dv1->search(1000); dv1->del(12); dv1->show(); dv1->del(1995); dv1->show(); dv1->del(1); dv1->show(); dv1->modify(15, 33); dv1->modify(200, 1); dv1->modify(100, 1); dv1->show(); // cout<<"next............"<<endl<<endl; // //2. double // dvector<double>* dv2=new dvector<double>; // dv2->push_back(12.2); // dv2->push_back(15.3); // dv2->push_back(1995.0220); // dv2->push_back(200.1); // dv2->push_back(2.3); // dv2->push_back(1.9); // // dv2->show(); // // dv2->search(1.9); // // cout << "next............" << endl << endl; // // //3. char* // dvector<const char*>* dv3=new dvector<const char*>; // dv3->push_back("nimei"); // dv3->push_back("de"); // dv3->push_back("垃圾"); // dv3->push_back("95"); // dv3->push_back("lalala"); // dv3->push_back("45"); // //dv3->show(); //dv3->search("nimei"); //cout << "next............" << endl << endl; std::cin.get(); return 0; }