使用STL的vector要留意幾點

vector是用於訪問的container中的所有元素,而一個list則用於在其中所有位置上進行插入操作。


爲什麼呢?

vector的底層實現是一片連續的存儲區,像是一個數組。

如果元素個數超過現有空間,vector會先分配一塊新的、更大的存儲區,接着將舊數據copy到新存儲區,然後銷燬舊存儲區,最好釋放舊存儲區。這就是所謂的“溢出“導致的重分配,有的時候這個代價不小。

一旦底層的存儲區重新分配過,還會有一個迭代器失效的問題。重新分配前得到的迭代器指向的空間很可能已經是非法的。這個失效,不僅”溢出“時會有,在vector中插入或者刪除元素也同樣存在。

所以使用vector最好的方式是,一次性的填入所有的元素(理想情況下,使用能事先預判大致的個數),然後在某處使用它。


如何避免”溢出“?

最徹底的辦法是要求程序員事先知道需要多少個對象。在這種情況下,可以使用reserve()來告訴vector與分配多大的存儲區,這樣就避免了所有的拷貝和析構操作,從而使得任何事情度可以很快完成。注意,reserver()預分配存儲區與通過給出一個整數作爲vector構造函數的第一個參數是有區別的;後者將使用元素類型的默認構造函數來初始化指定的元素個數。

如果事先無法確認需要多少個對象,並且vector的重新分配導致了性能問題,可以考慮改用其他序列容器。


怎樣用vector的插入和刪除?

因爲這兩者會導致迭代器失效以及vector的存儲區重新分配,對需要很多插入和刪除的情況而言,其最有效的使用條件是:

1)還是用reserve分配合適大小的存儲區,避免重新分配

2)最好只在後端添加或者刪除元素


發佈了72 篇原創文章 · 獲贊 7 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章