2008-10-31 71 views

回答

55

斯科特邁耶斯的有效STL項目17:使用swap技巧來減少產能過剩。

vector<Person>(persons).swap(persons); 

之後,persons是「收縮以適應」。

這取決於vector的拷貝構造函數只爲需要複製的元素分配內存的事實。

+0

建議修復語法:'收縮',而不是'收縮' – 2008-10-31 11:10:59

+0

不錯。你也許知道他們爲什麼沒有把它作爲一種方法來實現,因爲它看起來是容器的常見用例呢? – bombardier 2008-10-31 11:33:11

+1

一旦向量分配了一個緩衝區,就很難刪除[]該緩衝區的末尾。這樣做只是保證將來的插入將需要分配一個新的緩衝區並將一切複製到它(使迭代器無效)。 – 2008-10-31 16:52:28

8

從現有的創建一個新的臨時向量,然後在現有的向量上調用交換方法,傳遞臨時向量。讓臨時(現在使用舊的超大緩衝區)超出範圍。

嘿presto,你的矢量的內容大小恰到好處。

如果這聽起來像很多複製和分配 - 請記住,每次它必須重新分配超過其當前保留的限制時,這是矢量所做的。

[編輯] 是的,我只是說更多的話與塞巴斯蒂安相同。另一種情況是stackoverflow比賽條件;-)

+0

嗯,我向你提出了菲爾的建議,因爲即使你不是第一個發佈它,你的答案仍然有幫助! :-) – 2008-10-31 11:36:55

-2

您正在尋找相當於QVector::squeeze,恐怕它不在STL中明確存在。 如果Sébastien對您的STL實施正確,請轉到該答案。

16

如果您使用C++ 11,則可以使用vec.shrink_to_fit()。至少在VS2010中,這對你來說是交換技巧。

2

的交換技巧是減少對象的能力的有效途徑, 它交換我的矢量與新創建一個通過複製建設內容:

vector<Person>(persons).swap(persons); 

注意,有沒有保證persons.capacity();交換技巧等於 大小:vector(個人)的容量是庫執行 保留給大小爲vectors.size()的向量的容量。

C++ 11引入shrink_to_fit()

shrink_to_fit()以及交換技巧並不保證容量大小有效地減少到向量的大小 。

無論如何,shrink_to_fit()可以使迭代器無效(如果發生重新分配)或不能: 它取決於庫的實際實現。

請記住,交換技巧需要person.size()複製Person和Person.size()的構造結構的破壞。 shrink_to_fit()可以避免所有這些複製,並且可以讓你的迭代器有效。可以。但不時發生的情況是,shrink_to_fit()實施在 條款的交換技巧...