Inizializzazione di array 2D con il numero di righe e dinamica numero fisso di colonne. C ++
-
27-09-2019 - |
Domanda
Sto avendo problemi con la creazione di mia matrice dinamica 2D in C ++. I desidera avere numero dinamica (ad esempio numR) di "righe" e fissato (esempio 2) numero di "colonne".
Ho provato a fare in questo modo:
const numC = 2;
int numR;
numR = 10;
double *myArray[numC];
myArray = new double[numR];
Purtroppo, non funziona. E 'possibile farlo in tal modo un?
Naturalmente ho potuto utilizzare double **myArray
e inizializzarlo come se entrambe le dimensioni sono dinamiche (con NUMC usato come limitatore in loop) ma vorrei evitare se possibile.
Grazie in anticipo.
Soluzione
E 'possibile farlo in tal modo un?
Si
double (*myArray)[numC] = new double[numR][numC];
// ...
delete[] myArray;
Questo può sembrare un po 'inusuale, ma 5.3.4 §5 afferma chiaramente:
il tipo di
new int[i][10]
èint (*)[10]
Si noti che molti programmatori non hanno familiarità con la sintassi dichiaratore C e non capiranno questo codice. Inoltre, l'allocazione dinamica manuale non è sicuro eccezione. Per queste reaons, un vettore di array è meglio:
#include <vector>
#include <array>
std::vector<std::array<double, numC> > vec(numR);
// ...
// no manual cleanup necessary
Sostituire std::array
con std::tr1::array
o boost::array
, a seconda del compilatore.
Altri suggerimenti
Perché non usare un std :: vector , e approfittare del suo costruttore :
std::vector<std::vector<int> > my2Darray(2, std::vector<int>(10));
my2Darray[0][0] = 2;
Ci deve essere un loop in quanto è necessario per creare un array per ogni colonna .
Credo che quello che cercate è:
double *myArray[numC];
for (int i = 0; i < numC; i++) {
myArray[i] = new double[numR];
}
// some code...
// Cleanup:
for (int i = 0; i < numC; i++) {
delete [] myArray[i];
}
Questo dichiara un array di puntatori (a double
) con elementi numC
, poi crea un array di double
s con elementi numR
per ogni colonna in myArray
. Non dimenticate di rilasciare la memoria quando si è fatto con esso o avrete perdite di memoria.
I tuoi indici dovrebbero essere fila, poi colonna.
double** myArray = new double*[numR];
for( unsigned int i = 0; i < numR; i++ ) {
myArray[i] = new double[numC];
}
Accesso riga 2, colonna 5:
myArray[2][5];