Como Declarar Array 2D Usando novo em C++

Jinku Hu 12 outubro 2023
  1. Declarar Array 2D para Elementos de Acesso com arr[x][y]Notação
  2. Declare Array 2D para Elementos de Acesso com arr[] Notação
  3. Utilize o container vector para alocar de forma implícita o Dynamic 2D Array
Como Declarar Array 2D Usando novo em C++

Este artigo introduz múltiplos métodos C++ para declarar dinamicamente uma array 2D utilizando new.

Declarar Array 2D para Elementos de Acesso com arr[x][y]Notação

Esta solução utiliza new palavra-chave para que a estrutura matricial gerada possa ser acessada utilizando notação de array - x - y. A princípio, declaramos ponteiro para ponteiro para variável inteira (int **) e alocamos int pointer array de tamanho de linha na array. Em seguida, fazemos um laço sobre esta array de ponteiro e alocamos a array int de tamanho de coluna a cada iteração. Finalmente, quando terminamos a operação da array 2D, precisamos liberar a memória alocada. Observe que a desalocação é feita no loop de ordem inversa.

#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;

Declare Array 2D para Elementos de Acesso com arr[] Notação

Este método utiliza uma alocação de array única, tornando-o um método mais eficiente em termos de velocidade de execução do programa. Consequentemente, devemos utilizar a notação [] e alguma aritmética para acessar os elementos. Este método é a forma recomendada quando o tamanho da array aumenta, e os cálculos sobre seus elementos são bastante intensivos. Note também que a desalocação se torna mais fácil desta forma.

#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;
}

Utilize o container vector para alocar de forma implícita o Dynamic 2D Array

Alternativamente, podemos construir uma array dinâmica 2D utilizando um recipiente vector e sem alocação/desalocação manual de memória. Neste exemplo, inicializamos uma array 4x6 vector_2d com cada elemento do valor - 0. A melhor parte deste método é a flexibilidade da iteração com o loop baseado no intervalo.

#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

Artigo relacionado - C++ Array