Comment déclarer un tableau en 2D en utilisant le nouveau C++

Jinku Hu 12 octobre 2023
  1. Déclarer un tableau 2D pour accéder aux éléments avec la notation arr[x][y]
  2. Déclarer le tableau 2D pour accéder aux éléments avec la notation arr[]
  3. Utiliser un conteneur vectoriel pour allouer implicitement un tableau dynamique en 2D
Comment déclarer un tableau en 2D en utilisant le nouveau C++

Cet article présente plusieurs méthodes C++ pour déclarer un tableau 2D de manière dynamique en utilisant new.

Déclarer un tableau 2D pour accéder aux éléments avec la notation arr[x][y]

Cette solution utilise une new fonction qui permet d’accéder à la structure matricielle générée en utilisant la notation de tableau - [x][y]. Dans un premier temps, nous déclarons la variable pointeur à pointeur à entier (int **) et nous attribuons au tableau un pointeur int de taille de ligne dans le tableau. Ensuite, nous bouclons sur ce tableau de pointeurs et allouons le tableau int de taille de colonne à chaque itération. Enfin, lorsque nous terminons l’opération de tableau 2D, nous devons libérer la mémoire allouée. Notez que la désallocation se fait dans la boucle en sens inverse.

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

Production:

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

Déclarer le tableau 2D pour accéder aux éléments avec la notation arr[]

Cette version utilise une allocation de tableau unique, ce qui en fait une méthode plus efficace en termes de vitesse d’exécution du programme. Par conséquent, nous devrions utiliser la notation [] et un peu d’arithmétique pour accéder aux éléments. Cette version est la méthode recommandée lorsque la taille du tableau augmente et que les calculs sur ses éléments sont assez intensifs. Notez également que la désallocation devient plus facile de cette façon.

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

Utiliser un conteneur vectoriel pour allouer implicitement un tableau dynamique en 2D

Alternativement, nous pouvons construire un tableau dynamique en 2D en utilisant un conteneur vector et sans allocation/détachement manuel de la mémoire. Dans cet exemple, nous initialisons un tableau 4x6 vector_2d avec chaque élément de la valeur - 0. La meilleure partie de cette méthode est la flexibilité de l’itération avec la boucle basée sur la plage.

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

Article connexe - C++ Array