2016-12-13 50 views
0

陣列可以是線性的(一維)或多維的。只要它們給出相同的結果,這些數組之間有什麼區別?線性陣列和多維有什麼區別?

我認爲一個數組是一組內存中相同類型和大小的連續地址。這適用於多維數組嗎?

#include <iostream> 
using namespace std; 


int main() 
{ 

    int array1[4]  = {0, 1, 2, 3}; 
    int array2[1][4] = {0, 1, 2, 3}; 
    int array3[1][2][2] = {0, 1, 2, 3}; 

    cout << array1[0]  << endl; // 0 
    cout << array2[0][0] << endl; // 0 
    cout << array3[0][0][0] << endl; // 0 

    cout << array1[2]  << endl; // 2 
    cout << array2[0][2] << endl; // 2 
    cout << array3[0][1][0] << endl; // 2 

    return 0; 
} 
+1

不同之處在於元素被訪問的方式。如果你需要一個3d結構,你不想寫'array3 [i + size_i * j + size_i * size_j * k]'但是你想寫'array3 [i] [j] [k]' – user463035818

+0

@ tobi303這可能是一個由於空間局部的潛在好處而不虛僞。 – erip

+1

@erip不知道我是否理解你的評論..... – user463035818

回答

1

多維數組可以表示的至少兩種方式一種:單1X(N * M)陣列,或作爲N個1xM陣列(其在連續的存儲器,以及)。爲了符合你的命名,我們將前者稱爲線性陣列,後者稱爲「多維」陣列。

行排序(與C++類似)的語言在線性存儲數組時會從緩存一致性(由於空間局部性)中獲益。遍歷列時,會發現您的緩存更加頻繁地錯過。

這顯然是緩存大小的函數,以及您認爲迭代矩陣的頻率,因此在做出巨大的設計決策之前,確保它是一個瓶頸。

欲瞭解更多信息,請參閱this questionwikipedia

0

說我必須存儲一維陣列在一起。那麼你會怎麼做?

將它們合併成一個大陣列?

這是一個可能的解決方案! 但是地獄不!什麼是更整潔可讀的解決方案?製作這些一維數組的數組!不是嗎?這給了我們一個2維數組。

所以這就是多維數組的重要性,即使您可以訪問所有類型的數組中的值。

我希望你現在還沒有開始編碼。一旦開始編碼,單維和多維的使用變得更加明顯,而不是從閱讀中收集知識。

+0

訪問一維表示矩陣中的值並不難。 – erip

1

它只是語法糖。你可以聲明一個普通的int爲int x;或者int x[1][1][1][1][1];。它不會影響內存佈局,但後者的形式非常不方便使用,當你需要的只是一個整數。

同樣,使用應該代表2維的數據時,使用單個「損壞」陣列進行工作是不方便的,您必須通過[i*YSIZE + j]而不是[i][j]訪問該陣列。