Vector shrink 请求容器降低其容量和size匹配 shrink_to_fit();
一、先從size 和capacity 說起
resize(),設置大小(size);
reserve(),設置容量(capacity);
size()是分配容器的內存大小,而capacity()只是設置容器容量大小,但并沒有真正分配內存。 打個比方:買了一個新房子,新房子里可以放3張床reserve(3),這是說房子的容量是最多放3張床,但是屋里并不是有三張床,二resize(3),房里安裝了3張床,此時房里的床可以使用了。
reserve為容器預留足夠的空間,避免不必要的重復分配,分配空間大于等于函數的參數,影響capacity。但reserve的功能確實蹩腳,只能用reserve是的capacity變得比之前大。
resize調整容器中有效數據區域的尺寸,如果尺寸變小,原來數據多余的截掉。若尺寸變大,不夠的數據用該函數第二個參數填充,影響size。
由于vector是順序容器,在內存中分配了一塊連續的存儲空間。為了保證動態添加元素的高效率,因此必須預先為vector分配一段空間,這個空間就是capacity。
而容器中元素的個數就是size(),在容器中,capacity總是大于等于 size;
當vector數組插入數據量過大時,其capacity,會變得很大,且清空vector容器后,還會保留原分配的容量capacity。系統不會自動收回空間嗎?真的不會!!!!
我們一點一點寫程序把risize()跟reserve()弄那個明白。
運行結果
我們可以看出當Vector內只有五個元素時其分配空間還是1024,而reserve卻不能做出任何反應,蹩腳,但是reserve能讓容器空間變大,其實vector既然是容器他就會自動分配更多空間,所以reserve差評,這不是重點,重點是怎么將vector多分配出來的空間收回。有同學要說了clear()。
運行結果
然而clear只是將容器內的元素清空了,對于分配的capacity,卻沒有作用。在這里有幾種方法實現降低容量 ,但是其原理相同。
運行結果
當時我比較苦惱時大佬給我了兩個方法,上面那個,還有一個底層的寫法如下。
顯然t容器已經被降低容量,但是其容量降低的代價時newt的容量變大。所以這種方法不可取。還有第三種方法。
以上就是對于vector的capacity的探究,當數據量較少時,多分配的capacity可以忽略,但是當數據量很大之后,就不能忽略了,所以當你clear之后記著shrink呀。
總結
以上是生活随笔為你收集整理的Vector shrink 请求容器降低其容量和size匹配 shrink_to_fit();的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Win10内存占用持续增长怎么办 Win
- 下一篇: POJ 2054 Color a Tre