vector是用於訪問的container中的所有元素,而一個list則用於在其中所有位置上進行插入操作。
爲什麼呢?
vector的底層實現是一片連續的存儲區,像是一個數組。
如果元素個數超過現有空間,vector會先分配一塊新的、更大的存儲區,接着將舊數據copy到新存儲區,然後銷燬舊存儲區,最好釋放舊存儲區。這就是所謂的“溢出“導致的重分配,有的時候這個代價不小。
一旦底層的存儲區重新分配過,還會有一個迭代器失效的問題。重新分配前得到的迭代器指向的空間很可能已經是非法的。這個失效,不僅”溢出“時會有,在vector中插入或者刪除元素也同樣存在。
所以使用vector最好的方式是,一次性的填入所有的元素(理想情況下,使用能事先預判大致的個數),然後在某處使用它。
如何避免”溢出“?
最徹底的辦法是要求程序員事先知道需要多少個對象。在這種情況下,可以使用reserve()來告訴vector與分配多大的存儲區,這樣就避免了所有的拷貝和析構操作,從而使得任何事情度可以很快完成。注意,reserver()預分配存儲區與通過給出一個整數作爲vector構造函數的第一個參數是有區別的;後者將使用元素類型的默認構造函數來初始化指定的元素個數。
如果事先無法確認需要多少個對象,並且vector的重新分配導致了性能問題,可以考慮改用其他序列容器。
怎樣用vector的插入和刪除?
因爲這兩者會導致迭代器失效以及vector的存儲區重新分配,對需要很多插入和刪除的情況而言,其最有效的使用條件是:
1)還是用reserve分配合適大小的存儲區,避免重新分配
2)最好只在後端添加或者刪除元素