2017-04-24 47 views
2

我知道如何通過分配器創建1d數組(如a[10])。舉例來說,這裏是從cppreference抽象:如何爲int a [10] [10]分配內存分配器

#include <memory> 
#include <iostream> 
#include <string> 
int main() 
{ 
    std::allocator<int> a1; // default allocator for ints 
    int* a = a1.allocate(10); // space for 10 ints 

    a[9] = 7; 

    std::cout << a[9] << '\n'; 
    // the remainder was omitted ..... 
    return 0; 
} 

我不知道,但知道如何創建一個二維數組,像int a[10][10]。有人可以幫我解決這個問題嗎?

+2

這不是'C' .. –

+0

[我如何在C++中使用new聲明一個2d數組](http://stackoverflow.com/questions/936687/how-do-i-declare-a-2d- array-in-c-using-new) – Rogus

回答

0

您可以改爲使用y * 10 + x來分配100和訪問。編譯器如何生成索引[10] [10] [012]

int* a = allocate(100); 
a[5*10 + 2] = 9; //a[5][2] 
2

int[10][10]是10個元素的數組類型。元素類型是int[10]。這樣配置的相當於是:

std::allocator<int[10]> a2; 
int (*a)[10] = a2.allocate(10); 

你可以簡化代碼與一個類型別名,e.g:

using A = int[10]; 
std::allocator<A> a2; 
A *a = a2.allocate(10); 

注意,cppreference示例錯誤地接着寫a[9] = 7;allocate函數分配存儲空間,但不在存儲器中創建對象。 (標準明確地說,C++ 14表28)。使用帶有左側操作數但不指定對象的賦值運算符的未定義行爲。在使用賦值運算符之前,您需要隨後使用placement-new創建對象。該示例現已修復爲使用construct而不是allocate

+0

當分配存儲空間時,int的生存期開始:[basic.life] p1.1 – Cubbi

+0

@Cubbi該部分表示*如果創建int對象的代碼被執行*,則該int對象的生命週期的開始點是分配存儲的時間點。只分配存儲空間不會創建任何特定的對象。如果你在你的圖片中創建一個int或一個浮點數的malloc 4字節? (我看到有人認爲它會創建一個疊加的所有可能的4字節對象的每個對象!)無論如何,我不希望在評論中有這個參數,我會引用你[這個答案](http:// stackoverflow .com/a/40874245/1505939)進行標準參考和討論 –

+0

哦,這個討論。我認爲與C無關不兼容是一個缺陷,但我同意不管在哪裏調用allocator :: construct都是好主意。cppreference更新,謝謝。 – Cubbi

0

如果數組的大小是固定的,那麼您可以簡單地寫

int a[10][10]; 

和分配將是堆棧爲局部變量或全局變量的數據或bss段上(取決於你是否初始化數組成員或不)。

如果你想分配動態數組的大小,我會建議使用std::vector而不是數組。使用的std ::分配器你會寫

std::vector<std::vector<int>> a(10, std::vector<int>(10)); 

std::vector也可以採取第二個模板參數來定義從std::allocator不同的分配。請注意,內存不會連續分配。

描述了具有連續陣列大小的動態大小2D陣列的可能性here