容器 - vector (1)

上一章:智能指針之使用 (3)

目錄

C++里面的容器是怎么實現(xiàn)的呢?我們先不防自己寫一個vector試一下。
要實現(xiàn)vector機制,主要要考慮下面幾點

(1) 能夠動態(tài)擴容。
(2) 能夠通過下標取值。
(3) 能夠通過迭代器進行循環(huán)。

首先考慮(1)和(2),其實現(xiàn)非常簡單:

template<typename T>
class MyVector
{
    uint32_t capacity_;
    uint32_t length_;
    T* array_;
public:
    MyVector()
        :  capacity_(2), length_(0), array_(new T[capacity_])
    {}
    void push_back(const T& v)
    {
        if (length_ == capacity_)
        {
            extend();
        }
        array_[length_] = v;
        ++length_;
    }

    void remove(const T& v)
    {
        unsigned newIndex = 0;
        for (uint32_t i = 0; i < length_; ++i)
        {
            if (array_[i] == v)
            {
                continue;
            }

            if (newIndex != i)
            {
                array_[newIndex] = array_[i];
            }
            ++newIndex;
        }

        length_ = newIndex;
        if (length_ <= capacity_ / 3)
        {
            shrink();
        }
    }

    uint32_t size() const
    {
        return length_;
    }

    const T& operator[] (uint32_t index)
    {
        return array_[index];
    }

private:
    inline void extend()
    {
        capacity_ = 2 * capacity_;
        rellocate(capacity_);
    }

    inline void shrink()
    {
        if (capacity_ <= 2)
        {
            return ;
        }
        capacity_ = capacity_ / 2;
        rellocate(capacity_);
    }

    inline void rellocate(uint32_t size)
    {
        T* temp = new T[size];
        std::memcpy(temp, array_, sizeof(T) * length_);
        delete [] array_;
        array_ = temp;
    }
};

其中要注意的幾個點是:

(1)擴容和縮容時的算法。
(2)擴縮容時內(nèi)存的移動。
(3)刪除元素時,數(shù)組的重排列。

此實現(xiàn)幾乎沒有什么難度。下一節(jié)中將討論迭代器如何實現(xiàn),這樣就能利用STL的所有算法了。

后一章
目錄

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • 標簽(空格分隔): STL 運用STL,可以充分利用該庫的設(shè)計,讓我為簡單而直接的問題設(shè)計出簡單而直接的解決方案,...
    認真學計算機閱讀 1,600評論 0 10
  • 原文鏈接:http://net.pku.edu.cn/~yhf/UsingSTL.htm 三十分鐘掌握STL這是本...
    Transnet2014閱讀 1,136評論 0 10
  • STL部分 1.STL為什么廣泛被使用 C++ STL 之所以得到廣泛的贊譽,也被很多人使用,不只是提供了像vec...
    杰倫哎呦哎呦閱讀 4,468評論 0 9
  • 像夢一樣。 因為那時還年少,所以有了放縱的理由。你想了想,抿唇笑了,這么多年過去,卻仍舊有些不真實,仿佛時間流逝,...
    盡以閱讀 371評論 0 1
  • 文/巷子 “看到我,別跟我打招呼?!?劉若英 的確是看到一篇推文的介紹才來到這里。沒想到鐘先生會把雜志館開在這破舊...
    我是巷子閱讀 1,190評論 0 1

友情鏈接更多精彩內(nèi)容