Una matriu és un tipus d'estructura de dades que s'utilitza per emmagatzemar la col·lecció d'elements del mateix tipus de dades en ubicacions de memòria contigües. Les matrius poden ser unidimensionals o multidimensionals en funció del nombre d'direccions en què la matriu pot créixer. En aquest article, estudiarem matrius multidimensionals com ara matrius bidimensionals i matrius tridimensionals.
Què és la matriu multidimensional en C++?
Una matriu multidimensional és una matriu amb més d'una dimensió. És la col·lecció homogènia d'elements on s'accedeix a cada element mitjançant múltiples índexs.
Declaració de matriu multidimensional
datatype arrayName [ size1][size2]...[sizeN];>
on,
- tipus de dades: Tipus de dades a emmagatzemar a la matriu.
- arrayName: Nom de la matriu.
- talla1, talla2,..., talla N: Mida de cada dimensió.
Exemple:
Two dimensional array: int two_d[2][4]; Three dimensional array: int three_d[2][4][8];>
Mida d'una matriu multidimensional
La mida d'una matriu és igual a la mida del tipus de dades multiplicada pel nombre total d'elements que es poden emmagatzemar en una matriu. Podem calcular el nombre total d'elements d'una matriu multiplicant la mida de cada dimensió d'una matriu multidimensional.
Per exemple:
int arr1[2][4];>
- La matriu int arr1[2][4] pot emmagatzemar el total (2*4) = 8 elements.
- En C++, el tipus de dades int pren 4 bytes i tenim 8 elements a la matriu 'arr1' del tipus int.
- Mida total = 4 * 8 = 32 bytes .
int arr2[2][4][8];>
- Matriu int arr2[2][4][8] pot emmagatzemar un total (2*4*8) = 64 elements.
- La mida total de ' arr2 ‘ = 64*4 = 256 bytes .
Per verificar el càlcul anterior podem utilitzar grandària de () mètode per trobar la mida d'una matriu.
C++
// C++ program to verify the size of multidimensional> // arrays> #include> using> namespace> std;> > int> main()> {> > // creating 2d and 3d array> > int> arr1[2][4];> > int> arr2[2][4][8];> > > // using sizeof() operator to get the size of the above> > // arrays> > cout <<> 'Size of array arr1: '> <<> sizeof> (arr1)> > <<> ' bytes'> << endl;> > cout <<> 'Size of array arr2: '> <<> sizeof> (arr2)> > <<> ' bytes'> ;> > > return> 0;> }> |
>
>Sortida
Size of array arr1: 32 bytes Size of array arr2: 256 bytes>
Les matrius multidimensionals més utilitzades són:
- Matriu bidimensional
- Matriu tridimensional
Matriu bidimensional (o matriu 2D)
Una matriu bidimensional en C++ és una col·lecció d'elements organitzats en files i columnes. Es pot visualitzar com una taula o una graella, on s'accedeix a cada element mitjançant dos índexs: un per a la fila i un altre per a la columna. Igual que una matriu unidimensional, els índexs de matriu bidimensionals també oscil·len entre 0 i n-1 tant per a files com per a columnes.
Sintaxi de la matriu 2D
data_Type nom_matriu[ n ][ m ];
On,
knn
- n: Nombre de files.
- m: Nombre de columnes.
Podem declarar una matriu 2D de manera estàtica i dinàmica. En la declaració estàtica, la memòria s'assigna durant el temps de compilació, i en la memòria dinàmica s'assigna durant el temps d'execució. L'anterior és la sintaxi per a la declaració estàtica d'una matriu 2D. Per saber com declarar la matriu 2d dinàmicament, consulteu això article.
Inicialització de matrius bidimensionals en C++
A continuació es donen diferents maneres d'inicialitzar una matriu 2D:
- Utilitzant la llista d'inicialitzadors
- Ús de bucles
1. Inicialitzeu la matriu 2D mitjançant la llista d'inicialitzadors
Podem inicialitzar una matriu 2D mitjançant una llista d'inicialitzadors de dues maneres. A continuació es mostra el primer mètode per inicialitzar una matriu 2D mitjançant una llista d'inicialitzadors.
Primer mètode: La matriu següent té 2 files i 4 columnes. Els elements s'omplen de manera que els 4 primers elements s'omplen a la primera fila i els 4 següents a la segona fila.
int arr[2][4] = {0, 1, 2, 3, 4, 5, 6, 7};>
Segon mètode: La forma següent és la forma més neta d'iniciar una matriu 2D, la llista imbricada representa els elements en una fila i el nombre d'elements que hi ha al seu interior és igual al nombre de columnes d'una matriu 2D. El nombre de llistes imbricades representa el nombre de columnes.
int x[2][4] = {{0, 1, 2, 3}, {4, 5, 6, 7}};>
2. Inicialització de la matriu 2D mitjançant Loops
També podem inicialitzar la matriu 2D mitjançant bucles. Per inicialitzar la matriu 2D hem d'utilitzar dos bucles imbricats i els bucles imbricats són iguals a la dimensió. Per exemple, per inicialitzar una matriu 3D hem d'utilitzar tres bucles imbricats. Vegem un exemple.
Exemple: A l'exemple següent, hem inicialitzat la matriu 2D amb 1. El bucle exterior s'utilitza per fer el seguiment de les files i=0 significa la primera fila a causa de 0 indexant de manera similar j=0 significa la primera columna i combinant això x [0][0] representa la primera cel·la de la matriu 2D.
int x[2][4]; for(int i = 0; i <2; i++){ for(int j = 0; j <4; j++){ x[i][j] = 1; } }>
Accés a elements de matrius bidimensionals en C++
Podem accedir als elements d'una matriu de 2 dimensions mitjançant índexs de files i columnes. És similar a la posició de l'element de la matriu, però l'única diferència és que aquí la indexació comença des de 0.
Sintaxi:
array_name[i][j];>
on,
- jo: Índex de fila.
- j: Índex de la columna.
Exemple: A continuació es mostra l'índex d'elements de la segona fila i la tercera columna.
int x[1][2];>
Entenem-ho mitjançant el codi imprimint elements d'una matriu 2D.
Exemple de matriu 2D
C++
següent escàner
// c++ program to illustrate the two dimensional array> #include> using> namespace> std;> > int> main()> {> > > int> count = 1;> > > // Declaring 2D array> > int> array1[3][4];> > > // Initialize 2D array using loop> > for> (> int> i = 0; i <3; i++) {> > for> (> int> j = 0; j <4; j++) {> > array1[i][j] = count;> > count++;> > }> > }> > > // Printing the element of 2D array> > for> (> int> i = 0; i <3; i++) {> > for> (> int> j = 0; j <4; j++) {> > cout << array1[i][j] <<> ' '> ;> > }> > cout << endl;> > }> > > return> 0;> }> |
>
>Sortida
1 2 3 4 5 6 7 8 9 10 11 12>
Explicació: En el codi anterior hem inicialitzat el recompte per '1' i hem declarat una matriu 2D amb 3 files i 4 columnes després d'això hem inicialitzat la matriu amb el valor de count i el valor d'increment de count en cada iteració del bucle. A continuació, estem imprimint la matriu 2D mitjançant un bucle imbricat i podem veure a la sortida següent que hi ha 3 files i 4 columnes.
Complexitat temporal: O(n*m)
Complexitat espacial: O(n*m)
on n és el nombre de files i m és el nombre de columnes.
Matriu tridimensional en C++
La matriu 3D és una estructura de dades que emmagatzema elements en una estructura tridimensional semblant a un cuboide. Es pot visualitzar com una col·lecció de múltiples matrius bidimensionals apilades una sobre l'altra. Cada element d'una matriu 3D s'identifica pels seus tres índexs: l'índex de fila, l'índex de columna i l'índex de profunditat.
Declaració de matriu tridimensional en C++
Per declarar una matriu 3D en C++, hem d'especificar la seva tercera dimensió juntament amb les dimensions 2D.
Sintaxi:
dataType arrayName[d][r];>
- DataType: Tipus de dades a emmagatzemar en cada element.
- arrayName: Nom de la matriu
- d: Nombre de matrius 2D o profunditat de matriu.
- r: Nombre de files a cada matriu 2D.
- c: Nombre de columnes a cada matriu 2D.
Exemple:
int array[3][5][2];>
Inicialització d'una matriu tridimensional en C++
Per inicialitzar la matriu 3D en C++, seguim els mateixos mètodes que hem utilitzat per inicialitzar la matriu 2D. A la matriu 3D, tenim una dimensió més, així que hem d'afegir una llista d'elements més imbricada.
Una matriu 3D en C es pot inicialitzar utilitzant:
- Llista d'inicialitzadors
- Bucles
Inicialització de la matriu 3D mitjançant la llista d'inicialitzadors
Mètode 1: En aquest mètode, hem d'escriure el nombre total d'elements dins de claus, i cada element es col·loca a la seva posició segons la dimensió donada.
int x[3][5][2] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 30};>
Mètode 2 (millor) : En aquest mètode, hem particionat els elements mitjançant llistes imbricades i és fàcil de llegir.
int x[3][5][2] = { { {0, 1}, {2, 3}, {4, 5}, {6, 7}, {8, 9} } , { {10, 11}, {12, 13}, {14, 15}, {16, 17}, {18, 19} } , { {20, 21}, {22, 23}, {24, 25}, {26, 27}, {28, 30} } , } ;>
Inicialització de la matriu 3D mitjançant bucles
Aquest mètode és el mateix que inicialitzar una matriu 2D mitjançant bucles amb un bucle més imbricat per a la tercera dimensió.
int x[3][5][2]; for (int i = 0; i <3; i++) { for (int j = 0; j <5; j++) { for (int k = 0; k <2; k++) { x[i][j][k] = (some_value) ; } } }>
Accés als elements de la matriu tridimensional en C++
L'accés als elements en matrius 3D és tan senzill com accedir als elements en matrius 2D. Aquí el que hem de fer un treball addicional és afegir un bucle més imbricat per fer un seguiment de la tercera dimensió.
C++
// C++ program to illustrate the 3d array> #include> using> namespace> std;> > int> main()> {> > > int> count = 0;> > // declaring 3d array> > int> x[2][2][3];> > > // initializing the array> > for> (> int> i = 0; i <2; i++) {> > for> (> int> j = 0; j <2; j++) {> > for> (> int> k = 0; k <3; k++) {> > x[i][j][k] = count;> > count++;> > }> > }> > }> > > // printing the array> > for> (> int> i = 0; i <2; i++) {> > for> (> int> j = 0; j <2; j++) {> > for> (> int> k = 0; k <3; k++) {> > printf> (> 'x[%d][%d][%d] = %d
'> , i, j, k,> > x[i][j][k]);> > count++;> > }> > }> > }> > > return> 0;> }> |
>
>Sortida
fons css
x[0][0][0] = 0 x[0][0][1] = 1 x[0][0][2] = 2 x[0][1][0] = 3 x[0][1][1] = 4 x[0][1][2] = 5 x[1][0][0] = 6 x[1][0][1] = 7 x[1][0][2] = 8 x[1][1][0] = 9 x[1][1][1] = 10 x[1][1][2] = 11>
Explicació: Al codi anterior, hem inicialitzat la matriu 3D mitjançant el bucle tal com s'ha explicat anteriorment amb el nombre del 0 al 7 mitjançant la variable de recompte i després accedint als elements amb el mateix bucle utilitzat per inicialitzar la matriu 3D. L'única diferència és que en comptes d'assignar un element a una posició determinada, diguem x[0][0][1]=1 estem imprimint l'element emmagatzemat en aquesta ubicació tal com es veu a la sortida següent.