La mejor manera de representar una matriz 2-D en C++ con un tamaño determinado en tiempo de ejecución

StackOverflow https://stackoverflow.com/questions/256297

Pregunta

En C++ me gustaría hacer algo como:

int n = get_int_from_user();

char* matrix = new char[n][n];

matrix[0][0] = 'c';
//...
matrix[n][n] = 'a';

delete [][] matrix;

pero por supuesto esto no funciona.¿Cuál es la mejor manera de hacer algo similar?He visto algunas soluciones a esto pero parecen bastante complicadas.

¿Fue útil?

Solución

La forma dinámica manual:

Digamos que desea una matriz de ancho * alto, la forma más eficiente es usar una matriz unidimensional:

char *matrix = new char[width*height];

Para eliminarlo:

delete[] matrix;

Para acceder a él:

char getArrayValue(char *matrix, int row, int col)
{
  return matrix[row + col*width];
}

Para modificarlo:

void setArrayValue(char *matrix, int row, int col, char val)
{
  matrix[row + col*width] = val;
}

Matriz de impulso:

Considere usar boost :: matrix si puedes tener la dependencia.

A continuación, puede vincular el boost linear álgebra bibliotecas.

Aquí hay algunos código de muestra de impulso: : matriz :

#include <boost/numeric/ublas/matrix.hpp>
using namespace boost::numeric::ublas;
matrix<char> m (3, 3);
for (unsigned i = 0; i < m.size1 (); ++ i)
    for (unsigned j = 0; j < m.size2 (); ++ j)
        m (i, j) = 3 * i + j;

En la pila para algunos compiladores:

Algunos compiladores realmente le permiten crear matrices en la pila con tamaños determinados en tiempo de ejecución. g ++ es un ejemplo de tal compilador. Sin embargo, no puede hacer esto por defecto VC ++.

Entonces, en g ++ este es un código válido:

int width = 10;
int height = 10; 
int matrix[width][height];

Drew Hall mencionó que esta función C99 se llama Matrices de longitud variable (VLA) y que probablemente se puede activar en cualquier compilador moderno.

Otros consejos

Normalmente hago algo como esto:

char *matrix = new char [width * height];

matrix[i + j * width] = 'c'; // same as matrix[i][j] = 'c';

delete [] matrix;

¿Qué pasa con std::vector< std::vector<int> > array2d;?

Parece que te estás perdiendo el sentido de C++ (C con clases) :-).Este es el tipo de uso que pide a gritos que una clase lo implemente.

podría simplemente use STL u otra biblioteca de clases de terceros que estoy seguro tendrá la estructura de datos que está buscando pero, si necesita crear la suya propia, simplemente cree una clase con las siguientes propiedades.

  • constructor que, dado n, simplemente creará una nueva matriz n*n de caracteres (por ejemplo, charray).
  • funciones miembro que obtienen y establecen valores basados ​​en x.y que simplemente se refieren a charray[x*n+y];
  • destructor que elimina [] es la matriz.

Para una verdadera matriz bidimensional:

int n = get_int_from_user();

char** matrix = new char*[n];
for (int i = 0; i < n; i++) {
    matrix[i] = new char[n];
}

// Operations on matrix.

for (int i = 0; i < n; i++) {
    delete [] matrix[i];
}
delete matrix;

Justo en la parte superior de mi cabeza. Errores, sin duda. Sin embargo, otras personas han publicado un enfoque más elegante, creo.

boost :: multi_array

hacerlo a mano será un desastre.

Me gusta el enfoque de matriz 1-d (la respuesta seleccionada por Brian R. Bondy) con la extensión de que ajusta los miembros de datos en una clase para que no necesite hacer un seguimiento del ancho por separado:

class Matrix
{
    int width;
    int height;
    char* data;
public:
    Matrix();
    Matrix(int width, int height);
    ~Matrix();

    char getArrayValue(int row, int col);
    void setArrayValue(int row, int col, char val);
}

La implementación es un ejercicio para el lector. ;)

Creo que esta sería buena.

int n = get_int_from_user();

char **matrix=new (char*)[n];

for(int i=0;i<n;i++)
    matrix[i]=new char[n];

matrix[0][0] = 'c';
//...
matrix[n][n] = 'a';

for(int i=0;i<n;i++)
    delete []matrix;
delete []matrix;
std::vector<int> m;

Luego llame a m.resize () en tiempo de ejecución.

int* matrix = new int[w*h];

si desea hacer algo como la eliminación gaussiana, su matriz debería ser

int** matrix = new int*[h];
for(size_t i(0); i < h; ++i)
    matrix[i] = new int[w];

(en la eliminación gaussiana generalmente necesitamos intercambiar una fila con otra, por lo que es mejor intercambiar punteros a filas en tiempo constante en lugar de intercambiar copiando en tiempo lineal).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top