標籤:c++ stl
STL中的Vector相對關聯容器來說比較容易實現,其實際上就是一個動態數組的概念。此代碼只實現了類的幾個簡單的功能,因為Vector的迭代器比較特殊(其實就是×T)故而此處的代碼也很簡略。代碼如下:
#include<iostream>using namespace std;template<class T>class myVector{ public: typedef T value_type; typedef value_type* iterator; myVector():size(0),capacity(0){vec=new T[1];} explicit myVector(int _size):size(0),capacity(_size){ vec= new value_type[_size]; } myVector(int _size,T value):size(_size),capacity(_size) { vec= new value_type[_size]; for(int i=0;i<_size;i++) { vec[i]=value; } } myVector(const myVector&rhs) { capacity=rhs.cap(); size=rhs.count(); vec= new value_type[size]; iterator pos=rhs.begin(); int k=0; while(pos!=rhs.end()) { vec[k++]=*pos++; } } iterator *begin(){return &vec[0];} iterator *end(){return &vec[size];} ~myVector(){delete []vec; } void push_back(T value) { if(capacity==size) { if(capacity==0) { capacity=2; }else{ capacity=capacity*2; } T *oldArray=vec; vec=new value_type[capacity+1]; for(int i=0;i<size;i++) { vec[i]=oldArray[i]; } vec[size++]=value; delete []oldArray; }else{ vec[size++]=value; } } void fun() { T *p=vec; cout<<vec<<" "<<p<<endl; vec=new T[capacity]; cout<<vec<<endl; delete []p; } int count(){return size;} int cap(){return capacity;} void print(){ for(int i=0;i<size;i++) cout<<vec[i]<<" "; cout<<endl; } private: T *vec; int size; int capacity;};int main(){ myVector<int> my; my.push_back(5); my.push_back(6); my.push_back(7); my.push_back(11); my.print();}
此段代碼值得注意的是在整個數組空間遷移的時候,若之前的capacity為0時delete[]oldArray會出現問題。因為此時的oldArray壓根還在編譯器中不是以數組形式存放,若以數組形式釋放便會報錯。此處採取類初始化給vec一個1的實際空間是為避免此問題。
STL vector的簡單實現