C++标准模板库STL给出了vector,list,deque,stack,set,map等模板类,平时我们直接使用居多,对于类内部怎么实现不在意。现在以向量类vector为例,简单自定义:
其UML:
vetor<typename T>
-数组名ele:T
-数组目前大小size:int
-数组容量cap:int
+vector<T>();//用指定元素类型创建一个空向量
+sure():void//当增加元素增多至大于cap时候,自动扩充数组大小
+push_back(T VAL):void
+pop_back():void
+size1():int;
+at(int index):T
+empty():bool
+clear();void
+swap( v1:vector):void
//vector template<typename T> class vector{ private: T *ele; int size; int cap; public: vector<T>(){size=0;cap=16;ele=new T[cap];}//创建一个空向量 void sure(){if(size>cap) {T*old=ele; cap=2*size; ele=new T[cap]; for(int i=0;i<size;i++) ele[i]=old[i]; /*delete old;*/} }//当增加元素增多至大于cap时候,自动扩充数组大小,即实现按需增长 void push_back(T x); void pop_back(); int size1(); T at(int index); bool empty(); void clear(); void swap(vector<T> &v1);};
template<typename T> void vector<T>::push_back(T x){ sure(); ele[size++]=x;}
template<typename T> void vector<T>::pop_back(){ if(empty()) throw runtime_error("empty"); --size;}
template<typename T> int vector<T>::size1(){ return size;}
template<typename T> T vector<T>::at(int index){ if(empty()||index>cap) throw runtime_error("empty"); return ele[index];}
template<typename T> bool vector<T>::empty(){ if(size==0) return true; else return false;}
template<typename T> void vector<T>::clear(){ while(!empty()){ pop_back();} }
template<typename T> void vector<T>::swap(vector<T> &v1){ int len=v1.size1(); if(len>=size){ T *p=new T[len]; for(int i=0;i<size;i++) {p[i]=ele[i];} clear(); for(int i=0;i<len;i++) push_back(v1.at(i)); v1.clear(); for(int i=0;i<len;i++) {v1.push_back(p[i]);}} else{ T *p=new T[size]; for(int i=0;i<size;i++) {p[i]=ele[i];} clear(); for(int i=0;i<len;i++) {ele[i]=v1.at(i);} v1.clear(); for(int i=0;i<size;i++) {v1.push_back(p[i]);} }//交换不同长度的向量 }调用:
int main(){ vector<int> vi; for(int i=0;i<10;i++) vi.push_back(i); for(int i=0;i<vi.size1();i++) cout<<vi.at(i)<<" "; cout<<endl;//int类型vector cout<<"访问第100个元素"<<endl; try{cout<<vi.at(100);} catch(runtime_error&e){ cout<<e.what()<<endl;} vector<string> vs; vs.push_back("\"beijing\""); vs.push_back("\"shanghai\""); vs.push_back("\"nanjing\""); for(int i=0;i<vs.size1();i++) cout<<vs.at(i)<<" "; cout<<endl; //string类型vector vector<string> vss; vss.push_back("beijing"); vss.push_back("shanghai"); vss.push_back("beijing"); vss.push_back("shanghai"); for(int i=0;i<vss.size1();i++) cout<<vss.at(i)<<" "; cout<<endl; vs.swap(vss);//交换 cout<<"after swap:"<<endl; for(int i=0;i<vs.size1();i++) cout<<vs.at(i)<<" "; cout<<endl; for(int i=0;i<vss.size1();i++) cout<<vss.at(i)<<" "; system("pause"); return 0;}