Modifier

Voici un pense bête pour créer un vector multidimensionnel en C++. Je cherchais à utiliser un tableau dynamique en utilisant la class vector, notamment pour remplacer un tableau statique de ce type:

C_Objet tableau[TAILLE][TAILLE];

Avoir deux cases permet de simuler un tableau bidimensionnel comme une grille, et de retrouver facilement un objet avec des coordonnées de type x/y par exemple.

string nom = tableau[x][y].lireNom();

Et encore mieux de retrouver les objets situés juste à côté. Pratique quand la grille represente la carte d'un niveau de jeu par exemple.

string nom = tableau[x+1][y].lireNom();
string nom = tableau[x][y+1].lireNom();
...

Le probléme avec les tableaux statiques c'est que leurs tailles est rigide, elle ne peut pas évoluer. Elle est fixée à la compilation (ex #define TAILLE 36]. En revanche, le vector permet de reprendre ce principe avec la possibilité de faire varier la taille en cours de route. Le tableau statique est réputé plus rapide, mais surement pas de beaucoup, à tester.

Il existe plusieurs astuces éparpillés sur le Web, mais peu d'exemple simple et complet pour du bidimensionnel avec autre chose que du "int". Voici donc ce qui marche pour moi :

using namespace std;

#include <iostream>
#include <vector>

class C_Objet{ //creation d'un objet quelconque avec un truc à afficher dedans
  public:
    C_Objet(int id); 
    ~C_Objet();
    void print();
  private:
    int m_id; // L'id est le truc que l'on va afficher et il permettra de différencier les objets les uns de autres dans cet exemple
};

C_Objet::C_Objet(int id):m_id(id) {print();}; //Constructeur de l'objet. On affiche son contenu pour comparer.
C_Objet::~C_Objet(){};

void C_Objet::print(){cout << m_id << " ";}; //on affiche l'id

int main()
{

    vector < vector <C_Objet> > tableau ; //creation du conteneur pour stocker les lignes
    cout << "Creation du tableau\n";
    int id = 10; //id de départ.
    for(int y = 0; y < 4; y++){ //nombre de ligne 4
        vector <C_Objet> ligne; //creation d'un ligne pour stocker plusieurs 
        for(int x = 0; x < 8; x++){ //8 objets dans la ligne
            C_Objet Objet(id);
            id++;
            ligne.push_back(Objet); //on ajoute chaque objet à la ligne.
        }
            tableau.push_back(ligne); //On ajoute la ligne au tableau.
            cout << endl;
    }

    cout << "\nRelecture du tableau\n";
    for(int x = 0; x < tableau.size(); x++){ //tableau.size() retourne le nombre de ligne
        for(int y = 0; y < tableau[x].size(); y++){ //tableau[x].size() retourne le nombre de colonne dans la ligne en question.
                    tableau[x][y].print();
            }
                cout << endl;
        }
    return 0;
}

Avec ce code, vous devriez obtenir un résultat comme celui-ci.

Creation du tableau
10 11 12 13 14 15 16 17 
18 19 20 21 22 23 24 25 
26 27 28 29 30 31 32 33 
34 35 36 37 38 39 40 41 

Relecture du tableau
10 11 12 13 14 15 16 17 
18 19 20 21 22 23 24 25 
26 27 28 29 30 31 32 33 
34 35 36 37 38 39 40 41 

On peut ensuite jouer avec x et y pour afficher toute ou partie du tableau, ou bien changer l'ordre d'affichage.

Voilà, pas plus pour ce pense bête.

Cordialement, Kao

Posts en relation

Articles récents