tipos que programas ejemplos completo comandos cadenas bidimensionales basicos arreglos arreglo c++ c jagged-arrays

programas - que es un arreglo en c++



¿Existen arreglos irregulares en C/C++? (7)

Con las listas de inicializadores de C ++ 11, this se puede escribir de forma más compacta:

#include <vector> #include <iostream> int main() { // declare and initialize array std::vector<std::vector<int>> arr = {{1,2,3}, {4,5}}; // print content of array for (auto row : arr) { for (auto col : row) std::cout << col << " "; std::cout << "/n"; } }

El resultado es:

$ g++ test.cc -std=c++11 && ./a.out 1 2 3 4 5

Para referencia:

¿Hay algo así como una matriz dentada en C o C ++?

Cuando compilo esto:

int jagged[][] = { {0,1}, {1,2,3} };

Me sale este error:

error: la declaración de `dentada ''como una matriz multidimensional debe tener límites para todas las dimensiones excepto la primera


En C ++ (no compilado, y probablemente haya una sintaxis más compacta):

std::vector<std::vector<int> > myArray; myArray.push_back(std::vector<int>()); myArray.push_back(std::vector<int>()); myArray[0].push_back(0); myArray[0].push_back(1); myArray[1].push_back(1); myArray[1].push_back(2); myArray[1].push_back(3);

Ahora puede acceder a los elementos con, por ejemplo, myArray [0] [0], etc.


En C99 puedes hacer lo siguiente:

int jagged_row0[] = {0,1}; int jagged_row1[] = {1,2,3}; int (*jagged[])[] = { &jagged_row0, &jagged_row1 }; // note the ampersand // also since compound literals are lvalues ... int (*jagged2[])[] = { &(int[]){0,1}, &(int[]){1,2,3} };

La única diferencia aquí (en comparación con la respuesta de rampion) es que las matrices no se degradan en punteros y uno tiene que acceder a las matrices individuales a través de otro nivel de indirección (p *jagged[0] Ej. *jagged[0] ) y el tamaño de cada fila para ser grabado, es decir, sizeof(*jagged[0]) no se compilará) - pero son irregulares, apareciendo hasta el hueso;)


En CI usaría una matriz de punteros.

Por ejemplo:

int *jagged[5]; jagged[0] = malloc(sizeof(int) * 10); jagged[1] = malloc(sizeof(int) * 3);

etcétera etcétera.


Hay muchas formas de hacerlo. Aquí hay otra forma:

int jagged_row0[] = {0,1}; int jagged_row1[] = {1,2,3}; int *jagged[] = { jagged_row0, jagged_row1 };


La razón por la que recibió el error es que debe especificar los límites para al menos la dimensión externa; es decir

int jagged[][3] = {{0,1},{1,2,3}};

No puede haber variado [0] ser una matriz de 2 elementos de int y dentada [1] ser una matriz de 3 elementos de int; una matriz de N elementos es un tipo diferente de una matriz de elementos M (donde N! = M), y todos los elementos de una matriz deben ser del mismo tipo.

Lo que puede hacer es lo que los otros han sugerido anteriormente y crear irregular como una matriz de punteros a int; De esta forma, cada elemento puede apuntar a matrices enteras de diferentes tamaños:

int row0[] = {0,1}; int row1[] = {1,2,3}; int *jagged[] = {row0, row1};

Aunque row0 y row1 son tipos diferentes (arrays de 2 elementos frente a 3 elementos de int), en el contexto del inicializador ambos se convierten implícitamente al mismo tipo (int *).


Si solo desea inicializarlo, puede decir:

int jagged[][3] = { {0,1}, {1,2,3} };

pero la matriz todavía tendrá la forma [2] [3]. Si quieres una matriz dentada verdadera, tendrás que crearla dinámicamente. Y si haces eso, y estás usando C ++, deberías usar std::vector , como sugiere friol.