Cómo declarar un array 2D usando lo nuevo en C++

Jinku Hu 12 octubre 2023
  1. Declarar un array 2D para acceder a los elementos con la arr[x][y]
  2. Declarar el array 2D para acceder a los elementos con arr[] Notación
  3. Usar el contenedor vector para asignar implícitamente un array 2D dinámico
Cómo declarar un array 2D usando lo nuevo en C++

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;
}
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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

Artículo relacionado - C++ Array