C++ Vector 簡單實現 會用也要會寫
阿新 • • 發佈:2019-01-10
我們知道,記憶體塊的大小是不能改變的,因此陣列的大小不能改變。但是STL的vector讓我們擺脫了這種困擾,它可以幫我們動態的管理陣列的大小。
誠然,STL的vector底層還是通過動態陣列來實現的,當陣列大小不夠時,就申請一塊更大的記憶體,同時將原來的元素的值拷貝過去,再刪掉原來那塊小記憶體,當然這一操作的帶價是非常高的,包括了一次申請記憶體和釋放記憶體,以及元素的初始化。(更多的一些注意問題可以檢視之前的博文http://blog.csdn.net/u011408355/article/details/47060277)
本文給出了Vector類模板的實現,相比於STL的vector模板當然差的遠了,但是大致原理差不多了,大家讀讀下面的程式碼應該可以讓你對STL的vector的理解加深。
template<typename T>
class Vector{
public:
//建構函式,複製建構函式以及解構函式 Vector(int size=0):theSize(size),theCapacity(0+SPACE_CAPACITY){ objects=new T[theCapacity]; } Vector(const Vector& rhs):objects(NULL){ operator=(rhs); } ~Vector(){ delete[] objects; } // 過載=號操作符 const Vector& operator=(const Vector& rhs){ theCapacity=rhs.theCapacity; theSize=rhs.theSize; objects=new objects[this->theCapacity]; for(int i=0;i<this->theSize;i++) objects[i]=rhs.objects[i]; return *this; } //調整size void resize(int newSize){ if(newSize>theCapacity) reserve(newSize*2+1); theSize=newSize; }
//調整預留的空間,也就是實際上申請的記憶體的大小 void reserve(int newCapacity){ if(newCapacity<theSize) return; T* oldObject=objects; objects=new T[newCapacity]; theCapacity=newCapacity; for(int i=0;i<theSize;i++) objects[i]=oldObject[i]; delete objects; } //過載[]操作符 T& operator[](int index){ return *(objects+index); } const T& operator[](int index)const{ return *(objects+index); }
//幾個get函式,均為const成員,保證const物件也能呼叫
bool isEmpty() const{
return getSize()==0;
}
int capacity() const{
return theCapacity;
}
int size() const{
return theSize;
}
//push和pop操作
void push_back(T t){
if(theSize==theCapacity)
reserve(theCapacity*2+1);
objects[theSize++]=t;
}
void pop_back(){
theSize--;
}
T& back(){
return objects[theSize-1];
}
const T& back()const{
return objects[theSize-1];
}
// 迭代器
typedef T* iterater;
typedef const T* const_iterater;
//begin end 等操作
iterater begin(){
return objects;
}
const_iterater begin() const{
return objects;
}
iterater end(){
return (objects+theSize);
}
const_iterater end() const{
return (objects+theSize);
}
enum { SPACE_CAPACITY=16};
private:
T* objects;
int theSize;
int theCapacity;
};
這裡稍微提一下 const成員函式,也稱常成員函式,或者只讀成員函式,const物件只能訪問常成員函式,通過const指標呼叫也只能訪問常成員函式,但是有個特例,建構函式和解構函式是唯一不是const成員函式卻可以被const物件呼叫的成員函式。
若有錯誤,歡迎指正。