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;}
即实现了简单C++向量类自定义与实现。