Dichiara array 2D utilizzando new in C++

Jinku Hu 12 ottobre 2023
  1. Dichiara array 2D per accedere agli elementi con la notazione arr[x][y]
  2. Dichiara array 2D per accedere agli elementi con la notazione arr[]
  3. Usa il contenitore vector per allocare implicitamente un array dinamico 2D
Dichiara array 2D utilizzando new in C++

Questo articolo introduce più metodi C++ per dichiarare dinamicamente un array 2D utilizzando new.

Dichiara array 2D per accedere agli elementi con la notazione arr[x][y]

Questa soluzione utilizza la parola chiave new in modo che sia possibile accedere alla struttura di un array generata utilizzando la notazione dell’array - [x][y]. All’inizio, dichiariamo il puntatore al puntatore alla variabile intera (int **) e allochiamo l’array di puntatori int della dimensione della riga nell’array. Successivamente, eseguiamo un bucle su questo array di puntatori e assegniamo l’array int della dimensione della colonna a ogni iterazione. Infine, quando finiamo l’operazione con l’array 2D, dobbiamo liberare la memoria allocata. Si noti che la deallocazione viene eseguita nel bucle di ordine inverso.

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

Produzione:

83; 86; 77; 15; 93; 35;
86; 92; 49; 21; 62; 27;
90; 59; 63; 26; 40; 26;
72; 36; 11; 68; 67; 29;

Dichiara array 2D per accedere agli elementi con la notazione arr[]

Questo metodo utilizza una singola allocazione di array, rendendolo un metodo più efficiente in termini di velocità di esecuzione del programma. Di conseguenza, dovremmo usare la notazione [] e un po’ di aritmetica per accedere agli elementi. Questo metodo è il modo consigliato quando la dimensione dell’array diventa più grande e i calcoli sui suoi elementi sono piuttosto intensi. Nota anche che la deallocazione diventa più facile in questo modo.

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

Usa il contenitore vector per allocare implicitamente un array dinamico 2D

In alternativa, possiamo costruire un array 2D dinamico utilizzando un contenitore vector e senza allocazione / deallocazione manuale della memoria. In questo esempio, inizializziamo un array 4x6 vector_2d con ogni elemento del valore - 0. La parte migliore di questo metodo è la flessibilità dell’iterazione con il bucle basato su intervallo.

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

Articolo correlato - C++ Array