由deque分配的標準允許以稀疏方式存儲內存嗎?可以deque內存分配稀疏嗎?
我的理解是,大多數實現deque內部分配一些大小的塊內存。我相信,雖然我不知道這個事實,但是實現至少分配了足夠的塊來存儲當前大小的所有項目。因此,如果一個區塊是100個物品,並且您做了
std::deque<int> foo;
foo.resize(1010);
您將至少分配11個區塊。然而,鑑於在上述所有1010 int是默認構造你真的需要在調整大小調用時分配塊嗎?您是否可以在某人以某種方式實際插入項目時分配給定的塊。例如,實現可以將一個塊標記爲「所有默認構造」,並且在有人使用它之前不分配它。
我問,因爲我有一種情況,我可能想要一個非常大的deque,在我最終使用的元素方面可能相當稀疏。很明顯,我可以使用其他數據結構(如地圖),但我對Deque的規則感興趣。
給定調整大小void resize (size_type sz, T c = T());
簽名的相關問題是該標準是否要求默認構造函數恰好被調用sz
次?如果答案是肯定的,那麼我猜你至少對於具有非平凡默認構造函數的類型不能進行稀疏分配,儘管假設對於內置類型(如int或double)仍然可能。
你也許正在尋找reserve()? – PlasmaHH 2012-07-10 11:24:27
我不認爲這個實現可以延遲分配對象,因爲如果你研究'deque'的異常保證,你可能會發現'operator []'如果參數在'size )'。而且正如你在最後說的那樣,在'resize()'創建對象的地方可能有明確或隱含的保證。如果我可能不屑於查詢相關引用,我會做出回答:-) – 2012-07-10 11:25:35
@SteveJessop'operator []'必須有固定時間,不允許拋出,並且必須返回對有效對象的引用。另外,'resize'被_defined_複製構造額外的元素,在它被調用的時候。這些拷貝構造函數可能具有可觀察的副作用,並且標準中沒有特殊的語言來允許編譯器無論如何都將其忽略。 – 2012-07-10 11:35:24