2016-12-13 4 views
0

Arrays können linear (eine Dimension) oder mehrdimensional sein. Was ist der Unterschied zwischen diesen Arrays, solange sie das gleiche Ergebnis liefern?Was ist der Unterschied zwischen linearer Anordnung und mehrdimensionaler?

glaube ich ein Array eine Reihe von aufeinanderfolgenden Adressen von der gleichen Art ist und die Größe in dem Speicher. Gilt das für mehrdimensionale Arrays?

#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

Der Unterschied ist die Art, wie auf die Elemente zugegriffen wird. Wenn Sie eine 3D-Struktur müssen Sie nicht wollen, schreiben 'array3 [i size_i * j + size_i * size_j * k +]' aber Sie wollen schreiben 'array3 [i] [j] [k]' – user463035818

+0

@ tobi303 Das ist vielleicht ein wenig unaufrichtig wegen des möglichen Nutzens der räumlichen Lokalität. – erip

+1

@erip nicht sicher, ob ich Ihren Kommentar verstehe ..... – user463035818

Antwort

1

Multidimensional Arrays können seine dargestellt eine von mindestens zwei Arten: ein einzelner 1x (N * M) Array oder als eine Anzahl von N 1 × M-Arrays (die im Speicher aufeinander folgend sind, als auch). Um mit Ihrer Nomenklatur übereinzustimmen, werden wir die erstere als eine lineare Anordnung und die letztere als eine "multidimensionale" Anordnung bezeichnen.

Sprachen, die sind Reihenreihenfolge (wie C++) profitieren stark von Cache Kohärenz (aufgrund der räumlichen Lokalität), wenn Arrays linear gespeichert werden. Wenn Sie über Spalten iterieren, werden Sie feststellen, dass Ihr Cache viel häufiger fehlschlägt.

Dies ist offensichtlich eine Funktion der Größe Ihrer Caches und wie oft Sie denken, dass Sie über die Matrizen iterieren werden, also stellen Sie sicher, dass es ein Flaschenhals ist, bevor Sie große Designentscheidungen treffen.

Weitere Informationen finden Sie this question und wikipedia.

0

Angenommen, ich muss 1-dimensionale Arrays zusammen speichern. Also, was wirst du tun?

verschmelzen sie zu einem großen Array?

Das ist eine mögliche Lösung! Aber Hölle nein! Was ist besser und lesbare Lösung? Machen Sie ein Array dieser eindimensionalen Array! Ist es nicht? Das gibt uns ein zweidimensionales Array.

Also das ist, was die Bedeutung eines mehrdimensionalen Arrays, obwohl Sie Werte in allen Arten von Arrays zugreifen können.

Ich hoffe, Sie haben eine Menge Codierung jetzt nicht gestartet. Denn sobald Sie mit dem Codieren beginnen, wird die Verwendung von Einzeldimensionen und Multidimensionen deutlicher, anstatt Wissen aus dem Lesen zu sammeln.

+0

Es ist nicht schwer, auf Werte in einer eindimensional dargestellten Matrix zuzugreifen. – erip

1

Es ist nur syntaktischer Zucker. Sie könnten eine einfache int als int x; oder als int x[1][1][1][1][1]; deklarieren. Es hat keine Auswirkungen auf das Speicherlayout, aber die letztere Form ist sehr unpraktisch zu verwenden, wenn Sie nur eine einzige ganze Zahl benötigen.

Wenn Sie mit Daten arbeiten, die zwei Dimensionen darstellen sollen, ist es in der Regel unpraktisch, mit einem einzigen "gestümmelten" Array zu arbeiten, auf das Sie über [i*YSIZE + j] statt [i][j] zugreifen müssen.

Verwandte Themen