1. 程式人生 > >C++ Vector 簡單實現 會用也要會寫

C++ Vector 簡單實現 會用也要會寫

我們知道,記憶體塊的大小是不能改變的,因此陣列的大小不能改變。但是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物件呼叫的成員函式。

若有錯誤,歡迎指正。