2013-04-18 124 views
-1

對於100個元素它們的容器是什麼:map,set,list,vector會佔用最小的內存空間嗎?換句話說,當我們將100個元素push_back到容器映射時,設置,列表和向量哪個會佔用內存中最小的空間?例如sizeof(int)需要4Bytes,sizeof(short)需要2Bytes,問題是這些容器中的哪一個佔用最低的內存(最低的內存成本對我來說是最重要的)?提前致謝。STL中的容器C++

+1

爲什麼不試試? –

+0

我的猜測?無論是集合還是矢量。沒有鑰匙或指針需要,只是值和內存。如果有重複,則設置勝利。 – duffymo

+0

元素是唯一的還是重複的都是可能的?對於地圖,關鍵是什麼,價值是什麼? – Arun

回答

2

通常,縮小到適合的vector將具有任何序列容器的最小空間開銷,因爲除了少數指針和/或計數器外,唯一的空間開銷將是元素本身的空間(以及任何分配器使用的空間,這對於你描述的STL容器是不可避免的)。 mapsetlist都爲每個添加的元素保存額外的指針。 (並且map還需要保持鍵值類型以及值類型。)要迂迴,您實際上不能將push_back轉換爲setmap,儘管您可以將insert轉換成它們。

另一方面,沒有縮小到適合的vector通常會被過度分配,通常在1.5左右,但可能會達到2倍(可能更多,對於某些實現而言)所需的空間,以便分攤附加費用,而基於節點的容器如listsetmap通常不會。

如果這是一個問題,您可能會考慮deque,它有一些單位開銷(通常遠小於每個元素一個指針),但對其過度分配的限制要嚴格得多,而這種限制不會線性增長與序列的大小。

但是,容器的空間開銷不是典型地用於容器之間決定的首要標準,如​​vectorsetlist,或map。使用模式的要求往往更爲重要。例如,您是否需要能夠在常量時間內移除任意元素,或者不會使迭代器或引用無效?如果是這樣,vector是不合適的。你需要能夠插入/追加而不會使迭代器或引用無效?如果是這樣,vector是不合適的。你需要高效查找(尤其是混合插入和刪除)?如果是這樣,list是不合適的,vector也可能不合適,除非重新排序序列對於您的使用模式是可行的。你需要控制序列的順序嗎?如果是這樣,mapset將爲您重新排序元素,可能不合適。