Inicialização da matriz 2D com número dinâmico de linhas e número fixo de colunas. C ++
-
27-09-2019 - |
Pergunta
Estou tendo problemas em criar minha matriz dinâmica 2D em C ++. Eu quero que ele tenha um número dinâmico (por exemplo, NUMR) de "linhas" e número cortado (por exemplo, 2) de "colunas".
Eu tentei fazer assim:
const numC = 2;
int numR;
numR = 10;
double *myArray[numC];
myArray = new double[numR];
Infelizmente, não funciona. É possível fazer isso dessa maneira?
Claro que eu poderia usar double **myArray
e inicialize como se ambas as dimensões fossem dinâmicas (com NUMC usado como limitador no loop), mas eu gostaria de evitá -lo, se possível.
Desde já, obrigado.
Solução
É possível fazer isso dessa maneira?
Sim:
double (*myArray)[numC] = new double[numR][numC];
// ...
delete[] myArray;
Isso pode parecer um pouco incomum, mas 5.3.4 §5 afirma claramente:
o tipo de
new int[i][10]
éint (*)[10]
Observe que muitos programadores não estão familiarizados com a sintaxe do declarador C e não entenderão esse código. Além disso, a alocação dinâmica manual não é segura de exceção. Para esses reeons, um vetor de matrizes é melhor:
#include <vector>
#include <array>
std::vector<std::array<double, numC> > vec(numR);
// ...
// no manual cleanup necessary
Substituir std::array
com std::tr1::array
ou boost::array
, dependendo do seu compilador.
Outras dicas
Por que não usar um std :: vetor, e aproveite seu construtor:
std::vector<std::vector<int> > my2Darray(2, std::vector<int>(10));
my2Darray[0][0] = 2;
É preciso haver um loop, pois você precisa criar uma matriz para cada coluna.
Eu acho que o que você procura é:
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];
}
Isso declara uma variedade de ponteiros (para double
) com numC
elementos, então cria uma variedade de double
s com numR
elementos para cada coluna em myArray
. Não se esqueça de liberar a memória quando terminar ou você terá vazamentos de memória.
Seus índices devem ser linhas e coluna.
double** myArray = new double*[numR];
for( unsigned int i = 0; i < numR; i++ ) {
myArray[i] = new double[numC];
}
Linha de acesso 2, coluna 5:
myArray[2][5];