2010-07-29 110 views
0
int *x = new int[5](); 

有了上述的心態,應該如何爲二維數組編寫代碼 - int[][]多維數組和C++中的指針?

int **x = new int[5][5]() //cannot convert from 'int (*)[5]' to 'int **' 

在第一條語句,我可以使用:

x[0]= 1; 

但第二個更復雜,我無法弄清楚。 我應該使用類似:

x[0][1] = 1; 

或者,計算真正的位置,然後獲得的價值 第四行和列1

x[4*5+1] = 1; 
+1

你應該*不*做手工的內存管理。不僅因爲您必須記住刪除所有內容,而且因爲您可能會忘記或拋出異常而不安全,因此您的代碼很麻煩。使用'std :: vector',它們可以嵌套。 – GManNickG 2010-07-29 23:00:53

回答

2

可以單獨做初始化:

int **x = new int*[5]; 
for(unsigned int i = 0; i < 5; i++) 
    x[i] = new int[5]; 
+1

這就是我想要的:) – 2010-07-29 22:36:18

2

在C++中沒有new[][]運算符。您將首先必須分配指向int的指針數組:

int **x = new int*[5]; 

然後遍歷該數組。對於每個元素,分配整數數組:

for (std::size_t i = 0; i < 5; ++i) 
    x[i] = new int[5]; 

當然,這意味着你將有解除分配時做逆:delete[]每個元素,然後delete[]較大陣列作爲一個整體。

4

我喜歡做這種方式:

int *i = new int[5*5]; 

,然後我就指數由5 * row + col陣列。

+0

非常好,這可以避免多個分配的低效率。你可以把它封裝在一個通過爲你做索引計算隱藏事物的類中。 – 2010-07-29 22:49:09

+0

...然後您可以從C++ FAQ Lite中獲得解決方案:http://www.parashift.com/c++-faq-lite/operator-overloading.html#faq-13.10 – Cubbi 2010-07-29 23:28:45

+0

我同意,將它包裝在類爲了做行/列訪問是非常好的。 – Simon 2010-07-30 07:18:20

0

陣列FF已經預定義的大小可以簡單的寫:

int x[5][5]; 

compiles

如果不是,爲什麼不使用矢量?

+0

是的,該數組不是靜態大小。只是學習核心元素。就像你提到的有效方式是stl。 – 2010-07-30 00:21:33

+0

要回答你的問題,如果你使用push_back(),使用嵌套向量可能會非常低效。這是因爲重新分配最外層向量的底層內存將觸發它所包含向量的重新分配。 – 2011-06-03 11:42:42

+0

如果它會經常調整大小,我會建議你看看'std :: list'。元素檢索效率不高,但改變數據的大小將會(相對)便宜。 – 2011-09-29 12:29:51

1

這是你如何做到這一點:

int (*x)[5] = new int[7][5] ; 

我做了兩個尺寸不同的,所以你可以看到,你必須在LHS使用哪一個。

0

有幾種方式來實現:

  • 使用GCC的平多維數組的支持(TonyK的回答,最相關的問題IMO)。請注意,除非可能是第一個數組,否則您必須在數組類型的任何位置保留數組類型的邊界(包括所有數組大小),並且包含您調用的函數,因爲生成的代碼將採用單個數組。 $ new int [7] [5] $的分配會導致在內存中分配一個數組。由編譯器索引(您可以輕鬆編寫一個小程序並打印插槽的地址來說服自己)。使用數組指針數組。該方法的問題是不得不手動分配所有內部數組(循環)。

  • 有些人會建議使用std :: vectors的std :: vector's,但這是效率低下的,因爲內存分配和複製時,矢量調整大小時必須發生。

  • Boost在其multi_array庫中有一個向量矢量更高效的版本。

在任何情況下,這個問題比較好回答的位置: How do I use arrays in C++?