不可思議的縮小vetor

2021-07-12 01:27:42 字數 1004 閱讀 9181

如果vector的空間不夠時,會自動的申請新的空間,空間大小為舊空間的2倍,然後將舊空間的資料拷貝到新空間,最後將舊空間釋放。這種保留額外的記憶體空間已被將來增長的需要,從而防止增加新元素時過於頻繁的重新分配。這也是vector比陣列好的一點。

當然有沒有想過,(1)如果原有的舊空間為128,現在需要的空間為130,如果用vector儲存則會自動的申請更大的空間,則新的空間大小為256,這就造成了空間的浪費,那麼高效的c++程式會想辦法優化這種情況。則怎樣去縮小vector空間的大小。

(2)如果開始儲存的資料比較多例如為300個int型的空間,但是某些原因 需要刪除很多資料,(這裡需要知道vector刪除資料,但是vector的空間大小不改變,也就是說剩下的一點資料占用的vector空間還是300個int的大小)這種情況又會造成空間的浪費,那麼怎麼去縮小vector的空間,讓其空間與儲存的資料相等或者大一點。

以前自己也沒有考慮過這種問題,這個思路是看《高效c++》這本書時想到的。

vectorc(128);

現在c.size()=128, 而且c.capacity()>=128;

如果現在給vector尾部增加130個數,那麼空間不夠則重新申請新空間為2*128,但是儲存的資料僅僅占用的空間只需要130或者大一點舊足夠,於是可以通過如下方法去縮小vector的空間大小。

c.erase(c.begin() + 130, c.end());//刪除130個元素之外的所有元素。

vector(c).swap(c);//建立乙個臨時的(未命名)的vector,使之包含與c相同的內容,這裡臨時的vector與c的不同之處是:c有著過大的內部緩衝區並且有著大量額外空間,但是臨時的vector所具有的容量卻剛好容納c所有的元素的複製物件。然後通過swap()將c的內部緩衝區與臨時vector交換,就這樣改變了c的容量的大小,交換後臨時vector具有過大的內部緩衝區並且有著大量的額外空間,但是注意臨時vector離開生存空間,那塊大的緩衝區將會被系統記憶體收走。

有不可思議的目標 就有不可思議的結果

3月3號 開學 可惜學校的效率不好 要隔上5天才上課 悲劇 最後的半年了 換了新的老師 看上去很有個人魅力 蠻好 尊敬的老師還只有屈指可數的那幾個 失敗。或許是我沒有好好學習,沒有發現 陳昌主 現在的老師絕對算的上乙個,親和力很好,而且很勤奮。寫下這4個月的目標 1 english can read...

不可思議的BUG

莫看江面平如鏡,要看水底萬丈深 記一次由表象引起的不是bug的bug 先上圖 上圖,第一行是實際請求報錯的介面,第二行才是列印出的真正配置的介面位址,由於專案上會根據專案環境,會切換介面位址,方便開發 測試 生產。我的第一反應就是切換位址的邏輯有問題。仔細跟了他寫的 確實在介面請求前,位址是開發位址...

不可思議人體展覽

昨天去看了不可思議人體展覽,展館內人滿為患。在中國展出的時候,這個展覽叫做人體奧妙展。人體奧妙巡迴展 已在世界各地的二十四個城市展出過,德國解剖醫生馮.哈斯根將關閉於醫學院的解剖學,透過美學 藝術的改造,使得人體不再神秘,舉凡胚胎 呼吸 神經 消化 生殖等系統,都可透過此項展出揭秘。以前只在生物書上...