Cómo declarar un array 2D usando lo nuevo en C++
-
Declarar un array 2D para acceder a los elementos con la
arr[x][y]
-
Declarar el array 2D para acceder a los elementos con
arr[]
Notación -
Usar el contenedor
vector
para asignar implícitamente un array 2D dinámico
Este artículo presenta múltiples métodos de C++ para declarar un array 2D dinámicamente usando new
.
Declarar un array 2D para acceder a los elementos con la arr[x][y]
Esta solución utiliza una función new
para que se pueda acceder a la estructura del array generada utilizando la notación de array - [x][y]
. En primer lugar, declaramos puntero a puntero a la variable entera (int **
) y asignamos a el array de puntero int
el tamaño de la fila en el array. Luego, hacemos un bucle sobre esta array de punteros y asignamos el array int
del tamaño de las columnas en cada iteración. Por último, cuando terminemos la operación del array 2D, necesitamos liberar la memoria asignada. Noten, esa distribución se hace en el orden inverso al del bucle.
#include <iomanip>
#include <iostream>
using std::cin;
using std::cout;
using std::endl;
using std::setw;
constexpr int ROW = 4;
constexpr int COL = 6;
int main() {
int **matrix = new int *[ROW];
for (int i = 0; i < ROW; ++i) {
matrix[i] = new int[COL];
}
for (int i = 0; i < ROW; ++i) {
for (int j = 0; j < COL; ++j) {
matrix[i][j] = rand() % 100;
cout << setw(2) << matrix[i][j] << "; ";
}
cout << endl;
}
for (int i = 0; i < ROW; ++i) {
delete matrix[i];
}
delete[] matrix;
return EXIT_SUCCESS;
}
Resultado:
83; 86; 77; 15; 93; 35;
86; 92; 49; 21; 62; 27;
90; 59; 63; 26; 40; 26;
72; 36; 11; 68; 67; 29;
Declarar el array 2D para acceder a los elementos con arr[]
Notación
Esta versión utiliza una asignación de array única, lo que la convierte en un método más eficiente en términos de velocidad de ejecución del programa. En consecuencia, debemos usar la []
notación y algo de aritmética para acceder a los elementos. Esta versión es la forma recomendada cuando el tamaño de la array
se hace más grande, y los cálculos sobre sus elementos son bastante intensos. Nótese también que la desasignación se hace más fácil de esta manera.
#include <iomanip>
#include <iostream>
using std::cin;
using std::cout;
using std::endl;
using std::setw;
constexpr int ROW = 4;
constexpr int COL = 6;
int main() {
int *matrix = new int[ROW * COL];
for (int i = 0; i < ROW; ++i) {
for (int j = 0; j < COL; ++j) {
matrix[j * ROW + i] = rand() % 100;
cout << setw(2) << matrix[j * ROW + i] << "; ";
}
cout << endl;
}
delete[] matrix;
return EXIT_SUCCESS;
}
Usar el contenedor vector
para asignar implícitamente un array 2D dinámico
Alternativamente, podemos construir un array dinámica 2D usando un contenedor vector
y sin asignación/distribución manual de memoria. En este ejemplo, inicializamos un array de 4x6 vector_2d
con cada elemento del valor - 0
. La mejor parte de este método es la flexibilidad de la iteración con el bucle basado en el rango.
#include <iomanip>
#include <iostream>
#include <vector>
using std::cout;
using std::endl;
using std::setw;
using std::vector;
constexpr int ROW = 4;
constexpr int COL = 6;
int main() {
vector<vector<int> > vector_2d(ROW, vector<int>(COL, 0));
for (auto &item : vector_2d) {
for (auto &item1 : item) {
item1 = rand() % 100;
cout << setw(2) << item1 << "; ";
}
cout << endl;
}
return EXIT_SUCCESS;
}
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook