數據結構和算法分析c++:向量的實現

vector是比較常用的結構,在C++的STL中就有了vector的實現,爲避免與庫函數混淆,類模板命名爲Vector,它的本質還是基本的數組。
下面我們來看一下Vector的具體c++實現吧。

#ifndef REDEFINE_VECTOR_H_  
#define REDEFINE_VECTOR_H_  

template <typename Object>
class Vector
{
public:
    //默認構造函數是explicit顯式的,所有單參數構造函數必須是顯式的,以避免後臺的類型轉換,例如Vector<Object> obj = 37;
    explicit Vector(int initSize = 0) 
        : theSize(initSize),                        //theSize Vector實際的元素的個數;
        theCapacity(initSize + SPARE_CAPACITY) {    //theCapacity Vector內數組實際的大小,SPARE_CAPACITY是預留的空間,一個指數量,一個指能力;
        objects = new Object[theCapacity];          //申請一個容量爲theCapacity的動態數組;
    }

    //複製構造函數,由現有Vector對象,創建新的Vector對象;
    Vector(const Vector & rhs) :objects(nullptr) {  //C++ 11 nullptr 表示空指針,優於C的NULL,可防止c++程序的某些重載函數出現歧義;
        operator = (rhs);                           //lhs、rhs指的是 = 運算符左、右邊的操作數,goolge的c++編碼規範不推薦此種寫法;
    }

    //析構函數
    ~Vector() {
        delete[] objects;                           //delete原則是和new對應,new--delete,new[]--delete[],new[]前四位保存數組大小的信息,delete[]時調用數組大小次析構函數;
    }

    //複製賦值運算符,將一個Vector複製給另外一個;
    const Vector& operator=(const Vector& rhs) {
        if (this != &rhs) {                         //如果地址相同,直接返回;
            delete[] objects;                       //數組不能直接複製,只能刪除再建;
            theSize = rhs.theSize;
            theCapacity = rhs.theCapacity;
            objects = new Object[rhs.theCapacity];          
            for (int k = 0; k < rhs.theSize; k++) {
                objects[k] = rhs.objects[k];
            }
        }
        return *this;                               //返回自身,是爲了實現連續賦值的效果,例如Vector<Object> obj1, obj2, obj3; obj1 = obj2 = obj3;
    }

    //重置Vector內對象的數量;
    void resize(int newSize) {
        if (newSize > theCapacity) {                //新的大小比原來的容量大,才需要擴展容量;
            reserve(newSize * 2 + 1);               //翻倍擴容是爲了增加效率,+1是防止爲0的情況;
        }
        theSize = newSize;
    }

    //修改Vector容量;
    void reserve(int newCapacity) {
        if (newCapacity < theSize) {                //修改的容量不允許小於Vector內當前對象的數量;
            return;
        }
        Object* oldArray = objects;                 //舊的數據
        objects = new Object[newCapacity];          //申請新的數組,大小爲新的容量;
        for (int k = 0; k < theSize; k++) {         //複製舊的數組給新的數組;
            objects[k] = oldArray[k];  
        }
        theCapacity = newCapacity;                  //保存新的容量;
        delete[] oldArray;                          //刪除舊的數組;
    }

    //重載[]運算符,使Vector下標返回下標對應位置的對象;
    Object & operator[](int index) {
        return objects[index];
    }
    //const 形式
    const Object& operator[](int index) const {
        return objects[index];
    }

    //判斷Vector是否爲空;
    bool empty() const {
        return theSize == 0;
    }

    //返回Vector對象的個數;
    int size() const {
        return theSize;
    }

    //返回Vector的容量;
    int capacity() const {
        return theCapacity;
    }

    //在Vector尾部添加新對象;
    void push_back(const Object& x) {
        if (theSize == theCapacity) {               //判斷是否需要擴容;
            reserve(2 * theCapacity + 1);  
        }
        objects[theSize++] = x;                     //先賦值再對theSize自增;
    }

    //刪除Vector尾部的對象,直接另theSize減一;
    void pop_back() {
        theSize--;
    }

    //返回Vector尾部的對象;
    const Object& back() const {
        return objects[theSize - 1];
    }

    typedef Object* iterator;                       //聲明迭代器;
    typedef const Object* const_iterator;           //聲明常量迭代器;

    //返回迭代器的首部,即Vector的首對象;
    iterator begin() {
        return &objects[0];
    }

    const_iterator begin() const {
        return &objects[0];
    }

    //返回迭代器的尾部,即Vector的最後一個對象的對應位置的下一個位置的對象;
    iterator end() {
        return &objects[size()];
    }

    const_iterator end() const {
        return &objects[size()];
    }

    enum { SPARE_CAPACITY = 16 };                   //初始預留的容量  

private:
    int theSize;                                    //對象的數量
    int theCapacity;                                //數組大小
    Object* objects;                                //對象數組
};

#endif //REDEFINE_VECTOR_H_
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章