2014-09-12 41 views
0

我正在實現一個3維數組。很像Excel文檔的單元格和表單。 x和y是頁面大小,z是頁數。現在,每個頁面的x和y索引可以相同。C++中的3維數組

我想用向量(讓我們現在只是說只有字符串),以接近這一點,但它聲明如下:

std::vector<std::string> sheets; 
//x and y being the x-y coordinates and z being the number of pages. 
int size = x*y*z; 
sheets.reserve(size); 

因此給了我一個很好的一段連續的內存(如的定義std :: vector),這是快速和高效的。

我的問題是:是否有這樣做與std ::數組的方式? 有沒有一種方法可以在創建對象時創建數組大小,還是必須在編譯時知道這一點?

class sheetsObj 
{ 
    int x, y, z; 
    int size; 
    //Where size is x * y * z. 
    std::array<std::string, size> sheets; 
public: 
    sheetsObj(int xInd, int yInd, int zInd) : x{ xInd }, y{ yInd }, z{ zInd } {}; 
    .... 
} 

在此先感謝。

+2

對於'std :: array',編譯時必須知道大小。爲什麼你要使用'std :: array'呢?我懷疑'x * y * z'可能會對堆棧有點大。 – BoBTFish 2014-09-12 15:23:14

+2

'std :: array'需要在編譯時知道大小。如果您願意,您可以使用「模板」來指定大小。 – 2014-09-12 15:24:14

回答

2

最好的經驗法則是當你需要時使用std::vector,必要時使用std::array。在這種情況下,std::vector是您的最佳選擇。正如你所說,編譯時必須知道std::array的大小,所以如果你需要動態大小的存儲,這是一個不容忽視的問題。

+0

嗡嗡聲,我想這是另一種方式:當你可以使用'std :: array'時(即當你知道編譯時的大小),否則使用'std :: vector'。你能否贊成你的這個經驗法則? – gurka 2014-09-12 18:35:53

+1

當然,std :: vector是一個更靈活的數據類型,它更容易響應不斷變化的需求。它通常會使編程變得更容易,這總是令人滿意的。在堆分配很昂貴的環境中工作時,使用std :: array會很好,或者您已經對代碼進行了剖析並發現'vector's引發了一個問題。否則,它通常是不成熟的優化。 – TartanLlama 2014-09-12 20:20:40

1

std::array它的大小由模板參數確定,因此在編譯時評估,可能不適合您的需求(除非所有工作表都設計爲永遠具有相同的大小?)。

A std::vector將完全滿足您的要求,因爲您的程序不使用調整大小的開銷,並且您將根據需要獲取內存塊。

std::dynarray可能是您使用的最好的類,因爲它代表了一個運行時可初始化的數組,它在其生命週期中保持固定大小。然而,最初計劃隨C++ 14標準發佈,投票已將其排除在即將出臺的標準之外,稍後將其提交到單獨的技術規範中。