對於100個元素它們的容器是什麼:map,set,list,vector會佔用最小的內存空間嗎?換句話說,當我們將100個元素push_back到容器映射時,設置,列表和向量哪個會佔用內存中最小的空間?例如sizeof(int)需要4Bytes,sizeof(short)需要2Bytes,問題是這些容器中的哪一個佔用最低的內存(最低的內存成本對我來說是最重要的)?提前致謝。STL中的容器C++
-1
A
回答
2
通常,縮小到適合的vector
將具有任何序列容器的最小空間開銷,因爲除了少數指針和/或計數器外,唯一的空間開銷將是元素本身的空間(以及任何分配器使用的空間,這對於你描述的STL容器是不可避免的)。 map
,set
和list
都爲每個添加的元素保存額外的指針。 (並且map
還需要保持鍵值類型以及值類型。)要迂迴,您實際上不能將push_back
轉換爲set
或map
,儘管您可以將insert
轉換成它們。
另一方面,沒有縮小到適合的vector
通常會被過度分配,通常在1.5左右,但可能會達到2倍(可能更多,對於某些實現而言)所需的空間,以便分攤附加費用,而基於節點的容器如list
,set
或map
通常不會。
如果這是一個問題,您可能會考慮deque
,它有一些單位開銷(通常遠小於每個元素一個指針),但對其過度分配的限制要嚴格得多,而這種限制不會線性增長與序列的大小。
但是,容器的空間開銷不是典型地用於容器之間決定的首要標準,如vector
,set
,list
,或map
。使用模式的要求往往更爲重要。例如,您是否需要能夠在常量時間內移除任意元素,或者不會使迭代器或引用無效?如果是這樣,vector
是不合適的。你需要能夠插入/追加而不會使迭代器或引用無效?如果是這樣,vector
是不合適的。你需要高效查找(尤其是混合插入和刪除)?如果是這樣,list
是不合適的,vector
也可能不合適,除非重新排序序列對於您的使用模式是可行的。你需要控制序列的順序嗎?如果是這樣,map
和set
將爲您重新排序元素,可能不合適。
相關問題
- 1. C++ STL容器
- 2. C++ STL容器:: clear :: swap
- 3. C++ STL容器和引用
- 4. STL:容器的容器
- 5. 從C++中繼承STL容器11
- 6. 在Windbg中調試C++ STL容器
- 7. 容器訪問比較器(C++/STL)
- 8. stl容器的引用C++ 11
- 9. 用於STL容器的C++ IDE
- 10. C++ STL容器的空間複雜性
- 11. STL容器上的C++模板函數
- 12. stl兼容的容器
- 13. C++ STL;迭代包含STL容器的類嗎?
- 14. C++ 11 STL容器內shared_pointer常量性
- 15. 插入C++ map STL容器失敗
- 16. 將STL/C++/CLI容器傳遞給.Net
- 17. C++ STL容器和就地建設
- 18. STL容器'difference_type typedef
- 19. 關於STL容器
- 20. 爲什麼在C++ STL中分離算法,迭代器和容器STL
- 21. 獨特的STL容器
- 22. STL容器VS的Structs
- 23. STL容器上的指針
- 24. 模板化的STL容器
- 25. 迭代器和STL容器
- 26. stl容器中的搜索元素
- 27. 釋放stl容器中的opencv圖像?
- 28. 檢查Visual Studio 2015中的STL容器
- 29. STL中是否有排序的容器?
- 30. 共享內存中的STL容器(Windows)
爲什麼不試試? –
我的猜測?無論是集合還是矢量。沒有鑰匙或指針需要,只是值和內存。如果有重複,則設置勝利。 – duffymo
元素是唯一的還是重複的都是可能的?對於地圖,關鍵是什麼,價值是什麼? – Arun