當我不再需要預先保留的空間時,有沒有辦法調整std :: vector以降低容量?如何縮小std :: vector?
回答
斯科特邁耶斯的有效STL項目17:使用swap
技巧來減少產能過剩。
vector<Person>(persons).swap(persons);
之後,persons
是「收縮以適應」。
這取決於vector
的拷貝構造函數只爲需要複製的元素分配內存的事實。
從現有的創建一個新的臨時向量,然後在現有的向量上調用交換方法,傳遞臨時向量。讓臨時(現在使用舊的超大緩衝區)超出範圍。
嘿presto,你的矢量的內容大小恰到好處。
如果這聽起來像很多複製和分配 - 請記住,每次它必須重新分配超過其當前保留的限制時,這是矢量所做的。
[編輯] 是的,我只是說更多的話與塞巴斯蒂安相同。另一種情況是stackoverflow比賽條件;-)
嗯,我向你提出了菲爾的建議,因爲即使你不是第一個發佈它,你的答案仍然有幫助! :-) – 2008-10-31 11:36:55
您正在尋找相當於QVector::squeeze,恐怕它不在STL中明確存在。 如果Sébastien對您的STL實施正確,請轉到該答案。
如果您使用C++ 11,則可以使用vec.shrink_to_fit()
。至少在VS2010中,這對你來說是交換技巧。
的交換技巧是減少對象的能力的有效途徑, 它交換我的矢量與新創建一個通過複製建設內容:
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()實施在 條款的交換技巧...
- 1. std :: vector :: swap如何實現?
- 2. 如何導出std :: vector
- 3. C++ std :: vector如何工作?
- 4. iterate std :: vector <std :: vector <char>>?
- 5. 繼承std :: vector
- 6. 繼承std :: vector
- 7. posix_memalign for std :: vector
- 8. 指向std :: vector
- 9. NSMutableArray to std :: vector
- 10. emplace_back on std :: vector
- 11. sizeof()std :: vector(C++)
- 12. std :: list vs std :: vector迭代
- 13. std :: map初始化std :: vector
- 14. C++ std :: vector <std :: shared_ptr>
- 15. 如何在gdb中「觀察」C++ std :: vector的大小?
- 16. 如何迭代boost :: variant <std :: vector <int>,std :: vector <String>>?
- 17. 如何將std :: vector <unsigned short>轉換爲std :: vector <int>?
- 18. 如何通過不同的std :: vector的值對std :: vector進行排序?
- 19. std :: sort on std :: vector <std::string>
- 20. std :: vector如何分配對象?
- 21. 如何將asString()/ toString()添加到std :: vector?
- 22. 如何將整個流讀入std :: vector?
- 23. 'std :: vector`中的`emplace_back`如何工作?
- 24. std :: vector <T>
- 25. std :: vector :: resize in gcc4.2
- 26. std :: vector可以='d到另一個std :: vector嗎?
- 27. 其中std :: vector :: emplace_back比std :: vector :: push_back慢的示例?
- 28. 在std :: vector :: begin()之前遞減std :: vector :: iterator
- 29. 指定另一個std :: vector的std :: vector地址
- 30. C++ - 如何將std :: priority_queue中的元素複製到std :: vector
建議修復語法:'收縮',而不是'收縮' – 2008-10-31 11:10:59
不錯。你也許知道他們爲什麼沒有把它作爲一種方法來實現,因爲它看起來是容器的常見用例呢? – bombardier 2008-10-31 11:33:11
一旦向量分配了一個緩衝區,就很難刪除[]該緩衝區的末尾。這樣做只是保證將來的插入將需要分配一個新的緩衝區並將一切複製到它(使迭代器無效)。 – 2008-10-31 16:52:28