C++學習筆記(十五):vector對象在記憶體空間中是如何增長的,學習筆記vector

來源:互聯網
上載者:User

C++學習筆記(十五):vector對象在記憶體空間中是如何增長的,學習筆記vector

vector對象在記憶體空間中是如何增長的

 

我們都知道vector對象是動態儲存裝置的,從這一點看有點像鏈表,可以動態增加或減少元素。我們也知道鏈表中是有指標變數,專門用於儲存上一個和下一個元素的地址。正是因為這兩個指標的存在,我們才能做到動態儲存資料,即不用像數組那樣必須事先申請好空間。鏈表的缺點就是不能夠快速的隨機訪問其中元素,必須通過指標層層尋找。

但是,vector既可以實現動態儲存裝置資料,而且支援快速隨機訪問(用下標或者指標訪問元素)。對於能夠用下標尋找的資料類型,其儲存方式必定是連續的,即每個元素緊挨著前一個元素儲存。

這樣對於vector來說,就會出現一個問題,我在初始定義vector的時候該給其申請多少記憶體空間?如果申請的很小,那麼我來了新的資料改存放在哪裡?如果申請的很大,我用不完,那豈不是很浪費記憶體空間?

當然對於vector這種標準庫類型,通常我們只關心如何使用它,而不關心其實如何?的。不過對於其在儲存空間的實現方式還是瞭解一下比較好。


我們知道容器中元素連續儲存,且容器大小是可變的,考慮向vector中添加元素會發生什嗎?如果沒有空間容納新的元素,容器不可能簡單的將其添加到記憶體的其他位置,因為vector的元素必須連續儲存。因此容器必須分配新的空間來儲存已用的元素和新的元素。將已有元素從舊位置移動到新空間,然後添加新元素,釋放舊空間。如果說我們每添加一個新的元素就執行一次這樣的操作,顯然效能會慢到我們不可接受。


為了避免上面的代價,標準庫採用了可以減少容器空間重新分配的策略。當不得不擷取新的記憶體空間時,vector的實現通常會分配比新的空間需求更大的記憶體空間。容器預留這些空間作為備用,從而用來儲存更多新的元素。這樣,就不需要每次添加新的元素都重新分配容器的記憶體空間了。

 

vector類型提供了一些成員函數,允許我們與它的現實中記憶體配置部分互動。

c.capacity()     不重新分配記憶體空間的話,c可以儲存多少元素

c.reserve(n)     分配至少能容納n個元素的記憶體空間

c.shrink_to_fit()  將capacity()減少為size()相同大小。size()為vector已經儲存元素個數。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.