1. 程式人生 > >數據結構與算法(2)- vector概念介紹

數據結構與算法(2)- vector概念介紹

當前 博文 font happy 原創 怎麽辦 end 概念 del

聲明:雖然本系列博客與具體的編程語言無關。但是本文作者對c++相對比較熟悉,其次是java,所以難免會有視角上的偏差。舉例也大多是和這兩門語言相關。

Vector的出現主要是為了解決數組的靜態空間的問題。所謂靜態空間指的是一旦配置就不能改變。當然如果你硬要重新配置也是可以的,自己重新申請一塊空間,然後把數據搬過去。而vector是動態空間,它的內部機制會自行擴充空間以容納新元素。 可以用水桶裝水的例子來示意的感性認識一下。如圖1所示,不斷向水桶中裝水,那麽裝滿了之後怎麽辦呢。如果是數組的做法,那麽就需要自己搬一個更大的桶,把水裝進去。而如果是,vector的做法,那麽桶就可以自己隨著水的增多而變大哦。而且是水剛要滿時,水桶就自動變大。C++ vector自動增大至兩倍的容量。數組的做法與vector的做法分別如圖2和圖3。

技術分享圖片

圖1 裝水

技術分享圖片

                                 圖2 裝水-array

技術分享圖片

圖3 裝水-vector
那麽問題來了,怎麽能實現這種容量自增長呢,或者能夠從外部看上去是自增長呢?這時候就體現出面向對象的好處了我們可以構建一個類出來,這個類呢能夠幫助我們監測對象的容量,容量不夠的時候就自增容量至兩倍。這是容易做到的。可以通過一個私有的變量size就可以做到,每次先添加一個元素就增加1。當size與當前的容量一樣大的時候就擴容,並將數據拷貝到新的容器中,然後該釋放舊空間就釋放之類的。因為類的封裝,我們看不到這些內容,從外部看上去就實現了這種自增長容量的容器了。但是其原理必定也需要新構造一個空間出來。

技術分享圖片

圖4 vector

接來下介紹兩個概念:size,capacity。Begin和end之間的大小就是size,也就是當前的使用容量,可以理解成當前的水位;而capacity是當前所申請的空間大小,可以理解為水桶的容量。那麽當size==capacity的時候,就要capacity=capacity*2+1就可以了。當然實際操作起來並不是這麽簡單,不能把capacity*2+1就不管了,因為capacity也只是一個私有成員變量而已,咱們可不能自欺欺人。要做到實際創建這麽大的空間就需要空間分配啊,元素的搬移啊,實操起來還是比較麻煩的。這部分內容可參考《STL源碼剖析》4.2小節。另外一個問題是,如果我們不斷放水,當水量小到一定程度是,是不是大桶就是一種資源的浪費了呢?對應到程序上來就是空間的浪費。這時候可以換個小桶。那麽換多小的桶呢,一個自然的想法是1/2大小的,這樣與自增的大小就對應起來了。實際上在某些輸入情況下這是會產生性能問題的。比如在數據size 為1/2capacity時不斷插入然後刪除,那麽就會不停的換大桶小桶。在C++ stl中,選用1/4大小。

小秘密:下一篇將講解C++中的vector以及java中的vector與arrayList。

See you next time. Happy Coding!!!

我的GitHub
---------------------
作者:dnhua
來源:CSDN
原文:https://blog.csdn.net/dnhua/article/details/84797653
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!

數據結構與算法(2)- vector概念介紹