IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SL & STL C++ Discussion :

[débutant] tableau multi dimensionnel


Sujet :

SL & STL C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 8
    Par défaut [débutant] tableau multi dimensionnel
    Coucou tout le monde,
    je suis désolé de poser cette question qui je pense a déjà été posé mille et une fois, mais ayant beau faire des recherches, je n'arrive pas à trouver un moyen concret de résoudre mon problème, ou alors je ne comprends pas tout ce qui est raconté (voir je n'en vois pas l'utilité), anyway.

    Je cherche à faire un tableau multidimensionnel contenant des pointeurs, quelque chose qui ressemble à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SDL_Surface *surface;
    SDL_Rect *coordonnees;
     
    tableau_associatif["surface"]=surface;
    tableau_associatif["coords"]=coordonnees;
     
    tableauQuiContientTout.push(tableau_associatif);
    Je pensais utiliser std::set et std::vector, mais je n'arrive pas à m'en sortir avec ça.. si quelqu'un peut me montrer un exemple de comment construire mon tableau, ce serait génial, merci !

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 267
    Par défaut
    'Alut.
    Pour un tableau associatif, tu as les std::map.
    Pour une liste, tu as std::list
    Pour un vecteur, tu as std::vector.

    Toutes ces belles petites choses sont des templates.
    A savoir qu'ils se définissent comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    //Listes et vecteurs
    std::vector<SDL_Surface*> Vec1;
    std::list<SDL_Rect*> List1;
     
     
    //Tableau associatif
    typedef std::map<int, SDL_Rect*> tMap;
    tMap TableauAssoc1;
    //Exemples d'utilisation
    const int g_COORDS = 1;
    SDL_Rect *coordonnees;
    TableauAssoc1.insert(tMap::value_type(g_COORDS, coordonnees));
    Note qu'un tableau associatif ayant des char* (ou des string) comme clefs n'est pas judicieux. D'où mon utilisation d'un identifiant.

    Par contre pour ton tableauQuiContientTout, je ne vois pas trop ce que tu veux en faire, mais à mon avis, une liste ou un vecteur fera ton affaire.

    Voir la FAQ STL.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 8
    Par défaut
    En fait, ce que j'aimerai faire, se présente sous cette forme en PHP/Javascript/etc...

    var elements=new Array();
    elements[0]=new Array();
    elements[0]["surface"]=surface1;
    elements[0]["coords"]=coords1;
    elements[1]=new Array();
    elements[1]["surface"]=surface2;
    elements[1]["coords"]=coords2;
    etc...

    En C++ j'ai réussi à faire quelque chose qui ressemble à ça mais qui ne fonctionne pas complètement (problème dans la boucle) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    //plus haut dans le code, en dehors de ma fonction
    #define SURFACE 1
    #define COORDS  2
     
    //ma fonction main
    std::vector<std::vector<std::pair<int,std::string> > > conteneur;
     
    std::vector<std::pair<int,std::string> > v;
     
    v.push_back(std::make_pair(SURFACE,"ma surface"));
    v.push_back(std::make_pair(COORDS,"mes coords"));
     
    conteneur.push_back(v);
     
    std::vector<std::vector<std::pair<int,std::string> > >::iterator p;
    for(p=conteneur.begin();p!=conteneur.end();p++){
        // je ne sais pas comment afficher mon tableau associatif (surface, coords)
        std::cout<<*p->first<<std::endl; // ne fonctionne pas, erreur à la compilation
    }
    Sauf que d'une, je n'arrive pas à faire en sorte que je puisse insérer un SDL_Surface et un SDL_Rect à la place des strings "ma surface" et "mes coords", j'imagine qu'il faut utiliser les template, mais de quelle manière... :/
    Ensuite, je trouve le code un peu "compliqué" pour juste insérer un "tableau associatif" dans un tableau conteneur, surtout que j'ai pas l'impression que ce soit bon comme ça, car à priori je devrais créer autant de "std::vector<std::pair<std::string,std::string> >" que j'ai de tableau associatif à créer...
    Sinon troisième truc qui m'embête le fait de devoir définir un iterator avec 3 tonnes de "définitions" (std::vector<std::vector<std::pair<std::string,std::string> > >::iterator), j'imagine qu'il y a plus simple.. j'espère.. :o

    Merci pour ta réponse en tout cas

    [Edit] J'ai édité le code, il était pas complet.

    PS : J'ai beau lire la FAQ, je ne dois pas être doué parce-que je n'arrive pas à mon but !

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 267
    Par défaut
    Sauf que d'une, je n'arrive pas à faire en sorte que je puisse insérer un SDL_Surface et un SDL_Rect à la place des strings "ma surface" et "mes coords", j'imagine qu'il faut utiliser les template, mais de quelle manière... :/
    Euh... ça ne marche pas comme ça?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::vector<std::pair<int, SDL_Surface*>>;


    Sinon troisième truc qui m'embête le fait de devoir définir un iterator avec 3 tonnes de "définitions"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    std::vector<std::vector<std::pair<int,std::string> > > conteneur;
    std::vector<std::vector<std::pair<int,std::string> > >::iterator p;
    devient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    typedef std::vector<std::vector<std::pair<int,std::string> > > tBigConteneur;
    tBigConteneur conteneur;
    tBigConteneur::iterator p;

    Sinon pour un tableau associatif, tu peux utiliser les std::map (un peu plus simple à l'utilisation).

  5. #5
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Vu ce qu'il veut faire, je ne suis pas sur qu'une map soit une bonne solution.... Un vector semble bien. Ou peut être une multimap
    Voici une aide pour choisir le contener :
    http://cpp.developpez.com/faq/cpp/?p...hoix_conteneur

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 8
    Par défaut
    J'ai déjà été voir cette partie de la FAQ pour choisir le type de conteneur, mais à priori il me faut un vector qui contiendra plusieurs set qui eux contiendront mes 2 pointeurs vers mes SDL_Surface & SDL_Rect, si j'ai bien compris le diagramme.
    A priori le set permet de faire un tableau associatif, si j'interprette bien...

    non ?

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 8
    Par défaut
    A priori j'ai réussi à m'en sortir avec un vector qui contient des map, voici le code que j'ai actuellement et qui a l'air de fonctionner nickel (sauf que j'utilise une vieille boucle sans iterator pour afficher mon tableau)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    #include <iostream>
    #include <map>
    #include <vector>
    #include <string>
     
    #define SURFACE 1
    #define COORDS  2
     
    int main(int argc,char **argv){
        typedef std::map<int,std::string> maMap;
        typedef std::vector<maMap> monTab;
     
        monTab listeAffichage;
        maMap affichage;
     
        affichage[SURFACE]="ma super surface";
        affichage[COORDS]="mes super coords";
     
        listeAffichage.push_back(affichage);
     
        for(int i=0;i<listeAffichage.size();i++){
            std::cout<<listeAffichage[i][SURFACE]<<std::endl;
        }
     
        return 0;
    }
    Mon dernier problème est que pour l'instant j'ai uniquement des std::string dans mon map, sauf que là j'aimerai avoir 2 types (SDL_Rect et SDL_Surface), sauf qu'apparemment je ne peux pas faire de template genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef std::map<int,T> maMap;
    afin de pouvoir accueillir mes 2 types dans le map, comment faire ?

    Autre question, comment utiliser l'iterator pour faire la même chose qu'avec ma vieille boucle ?

    Dans l'optique de programmer "propre" en C++, j'aimerai savoir si vous auriez fait autremment, s'il y a des choses qui vous pique les yeux dans mon code, enfin en gros, qu'est-ce que vous changeriez dans mon code.

    Merci d'avance !

  8. #8
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par Synesthesia Voir le message
    A priori le set permet de faire un tableau associatif, si j'interprette bien...
    Non... un set est un ensemble trié sans doublon. Un multiset est une ensemble trié avec doublon
    Un tableau associatif sans doublon est une map, et un tableau associatif avec doublon est une multimap.

    Mon dernier problème est que pour l'instant j'ai uniquement des std::string dans mon map, sauf que là j'aimerai avoir 2 types (SDL_Rect et SDL_Surface), sauf que apparemment je ne peux pas faire de template genre
    Une méthode serait de faire d'utiliser le polymorphisme :
    un truc comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    struct SDL_obj{};
     
    template<type T>
    struct SDL_obj_diver : SDL_obj
    {
    explicit SDL_obj_diver (T* pointeur) : m_pointeur(pointeur){};
    T * m_pointeur;
    }
     
    std::map<int,SDL_obj*> maMap;
     
    maMap[blabla] = new SDL_obj_diver(pSDL_Rect);
    maMap[blabla] = new SDL_obj_diver(pSDL_Surface);
    Mais ce n'est certainement pas le plus propre.... doit y avoir des paterne pour cela.
    Autre question, comment utiliser l'iterator pour faire la même chose qu'avec ma vieille boucle ?
    sans vérifier que SURFACE est dans la map , un truc comme :

    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    monTab::iterator it =listeAffichage.begin();
    monTab::iterator end =listeAffichage.end();
    while(it!=end)
    {
    std::cout<<(*it)[SURFACE]<<std::endl;
    ++it;
    }

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 8
    Par défaut
    Merci beaucoup pour ta réponse, je pense que ça répond à mes besoins, par contre en ce qui concerne le polymorphisme, quelle est l'autre solution ? (tu parles de parternes)
    Parce-que c'est vrai que ça me semble étrange de devoir faire quelque chose d'aussi "compliqué" que du polymorphisme pour faire ça en C++ (surtout que ça n'a pas l'air d'être très propre), alors que dans nombre d'autres langages c'est très courant.

    Merci encore !

Discussions similaires

  1. Réponses: 7
    Dernier message: 08/02/2007, 10h52
  2. Réponses: 5
    Dernier message: 04/10/2006, 18h49
  3. [Tableaux] Tableau multi dimensionnel
    Par gids01 dans le forum Langage
    Réponses: 7
    Dernier message: 02/10/2006, 16h18
  4. [Tableaux] tri sur un tableau multi-dimensionnel
    Par nicoaix dans le forum Langage
    Réponses: 1
    Dernier message: 12/04/2006, 21h23
  5. Réponses: 4
    Dernier message: 24/08/2005, 14h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo