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

 C++ Discussion :

tableau a 2 dimention ?


Sujet :

C++

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2006
    Messages : 412
    Par défaut tableau a 2 dimention ?
    Bonjours

    Tout est dans le titre ou presque:
    j'ai d'abors chercher sur le web, et dans la faq
    http://cpp.developpez.com/faq/cpp/in...STL#STL_vector

    Mai pas d'exemple complet sur l'utilisation d'un tableau contenant d'autre tableau de type vector

    j'ai essayer un exemple simple mai bon :S
    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
     
    #include <iostream>
    #include <vector>
    int main()
    	{
    	typedef int I;					//changer de type facilement dans tout les tableaux
    	typedef std::vector<I> T0;		// T1 a 1 dim
    	typedef std::vector<T0> T1;		// T2 a 1 dim
    	typedef std::vector<T1> T3;		//a 2 dimension contenant 2 autre tableaux  de type int ?
     
    	T3 MT3(20);					// déclaration 20 tableau pouvant contenir 2 autre tableaux  ?
    	MT3[0][0].push_back(1);                //on insert le 1er élément segment faults ?
    	//std::cout << MT3[0][0][1] << std::endl; //affichage du premier élément ,semenfault (acès non vérifier)?
     
    	return 0;
    }
    un petit coup de pouce s'il vous plaît

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 119
    Billets dans le blog
    148
    Par défaut
    Bonjour,

    L'idée est intéressante. Mais en fait, la chose que accepte le std::vector dans ces chevrons, c'est un type (de données) et non une variable.
    Si vous voulez faire un tableau 2D, vous pouvez faire comme suit (pour des int) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::vector < std::vector < int > > m_int2DArray;
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Membre éclairé
    Inscrit en
    Mai 2005
    Messages
    348
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 348
    Par défaut
    Citation Envoyé par LittleWhite Voir le message
    Mais en fait, la chose que accepte le std::vector dans ces chevrons, c'est un type (de données) et non une variable...
    Justement... il semble créer une floppée de "typedef" donc T1 est un type de donnée et pas une variable... non?

    L'erreur ne vient elle pas plus de la profondeur du vecteur?
    T0 = vector < int >
    T1 = vector < T0 > = vector < vector < int > >
    T3 = vector < T1 > = vector < vector < vector < int > > >

    Du coup:
    MT3[0][0].push_back() attend un vector < int > comme argument et pas un "int".

    Non?

    PS: Ceci ne conteste pas ce que dit LittleWhite qui a mon sens est tout à fait juste.

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 119
    Billets dans le blog
    148
    Par défaut
    Ah oui ... exact ... (trop de typedef pour moi).

    Mais du coup, il fait un tableau à trois dimensions

    Note : Le premier élément serait MT3[0][0][0]

    Note 2 : T3 MT3(20); créer bien 20 emplacements pour des std :: vector < std :: vector < int > > mais ne remplie ni même ne défini la taille des autres tableaux. Du coup, l'accès MT3[0][0][0] crashera ... et même le premier push_back() ( MT3[0][0].push_back(1) car ... le std::vector MT3[0] n'est pas définit (n'a pas d'espace correspondant d'alloué)
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  5. #5
    Membre éclairé
    Inscrit en
    Mai 2005
    Messages
    348
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 348
    Par défaut
    Citation Envoyé par LittleWhite Voir le message
    Note 2 : T3 MT3(20); créer bien 20 emplacements pour des std :: vector < std :: vector < int > > mais ne remplie ni même ne défini la taille des autres tableaux. Du coup, l'accès MT3[0][0][0] crashera ... et même le premier push_back() ( MT3[0][0].push_back(1) car ... le std::vector MT3[0] n'est pas définit (n'a pas d'espace correspondant d'alloué)
    En effet, le piège des profondeurs.

  6. #6
    Membre émérite

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Par défaut
    Par curiosité, à quoi va te servir ton tableau 2D ?
    Si l'une des dimensions est connue à la compilation, tu peux envisager d'utiliser simplement une structure de N vecteurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    struct tabType {
    std::vector<T1> v1;
    std::vector<T2> v2;
    ...
    std::vector<TN> vN;
    };
    ou un vecteur de structures à N éléments
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    struct lineType { T1 e1; T2 e2; ...; TN eN; };
    std::vector<lineType> v;
    Si tu as effectivement besoin de gérer une matrice, regarde du côté des libs de calcul matriciel : OpenCV, uBlas, Eigen++, nt2, etc. Parce que les std::vector<...> imbriqués, ça devient vite inbuvable, et je ne suis pas certains que les perfs soient formidables.

  7. #7
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 119
    Billets dans le blog
    148
    Par défaut
    Pour l'histoire de la structure, je suis perplexe. Pourra t-on faire un parcours des éléments, de façon simple ?
    Et puis si c'est un tableau statique de 1000 éléments ?
    Par contre, on peut utiliser le compilateur pour le faire (avec les template)
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  8. #8
    Membre émérite

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Par défaut
    C'est pour ça que je demande la nature des éléments rangés dans son tableau.
    S'il veut simplement stocker des identifiants [id;login;mdp;nom;prenom;addresse] les solutions #1 et #2 suffisent. #1 sera certainement plus performant s'il compte faire des recherches dans son tableau, alors que #2 se manipulera plus facilement.

    S'il veut stocker un signal 2D (typiquement, une image de N*M, N et M n'étant pas forcément connus) alors il vaut mieux utiliser une matrice.

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2006
    Messages : 412
    Par défaut
    Merci pour vos réponse ,

    alors il s'agit de mettre des valeur d'un fichier, celle-ci son placer dans les tableaux,trier
    et affichée, pour être précis il s'agit des log sous linux c'est donc du std::string et pas du int.
    j'avais choisi de mettre du int ici par souci de faciliter.

    j'ai utiliser les typedef car les vector dans un souci de faciliter mai on dirait que sa fait l'effet inverse

    je me demande si je ne devrai pas me faire une classe tableaux ... parce que c'est vraiment hum.. pas simple.

    Pour la proposition deLittleWhite

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    std::vector < std::vector < int > > m_int2DArray;
    je l'utilise comment ?
    m_int2DArray[0][0].push_back(10);

    ou il y a une autre manière de procéder ?
    Merci de m'avoir lu

  10. #10
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 119
    Billets dans le blog
    148
    Par défaut
    Il faut comprendre une chose.
    Lorsque nous faisons un push_back sur un vector, cela lui rajoute une case à la fin.
    Exemple ->
    J'ai un vecteur tel que :
    [5] [1] [4] [8]
    Je fais un push_back(42)
    Il deviendra :
    [5] [1] [4] [8] [42]

    Pour votre cas, cela dépend si vous pouvez prédire le nombre de colonne (ou le nombre de ligne).

    car sans push_back(), l'accès à [0][0] plante.
    Si vous construisez votre tableau de la façon suivante (attention, il est plutôt statique) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::vector < std::vector < int > > my2DArray(10, std::vector<int>(10,42));
    Ce qui fait un tableau de 10x10 initialisé à 42, il devient "normal" de faire un accès [3][8]

    Par contre, pour un cas plus dynamique, cela sera plus dur, car l'insertion devra être d'une ligne entière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    std::vector < std::vector < int > > my2DArray;
     
    std::vector line1;
    line1.push_back(2);
    line1.push_back(7);
    line1.push_back(42);
     
    my2DArray.push_back(line1);
     
    // et là, je peux faire my2DArray[0][1]; (qui me donnera 7)
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2006
    Messages : 412
    Par défaut
    Merci pour ta réponse
    c'est pas très pratique , je pense utiliser une classe reste a savoir comment si prendre, il me faudra sûrement passer par le tas, donc new et pointeur en perspective

  12. #12
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Ceci dit, il est aussi possible (selon les circonstances ) de travailler dans l'autre sens :
    • ajouter un nouveau tableau dans la première dimension
    • ajouter les valeurs dans le tableau que l'on vient de rajouter
    Cela donnerait quelque chose comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    std::vector < std::vector < int > > my2DArray;
    my2DArray.push_back(std::vector<int>() );
    my2DArray[0].push_back(4);
    my2DArray[0].push_back(8);
    my2DArray[0].push_back(16);
    et je crois que l'on y gagnerait peut etre un peu en perf (car on évite la copie du "sous tableau")
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2006
    Messages : 412
    Par défaut
    vendu
    Merci ,avec un typedef sa devrai rouler :p

  14. #14
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2006
    Messages : 412
    Par défaut
    hello
    Je me suis fait une classe qui ce charge de gérer les vector. c'est moins performant , mai c est plus pratique (enfin pour moi hum..) cette classe n'a évidement de sens qui si un tableau doit en contenir d'autre.

    Les source son disponible en fichier joins. j'ai fait 2 exemple qui son sûrement a améliorer avec des templates .

    le problème:

    1.-
    La déclaration de la classe, si je peux facilement indique le nombre de tableau via le constructeur, je suis coincer pour ce qui est du 2em paramètre comment est-ce que je lui indique le type, la j'utilise un teste dans le constructeur mai est-ce possible de faire cela avec des template ?

    je précise que j'ai bien lu la doc sur les template, mai aucune d'elle ne touche aux constructeur d'une class . et c'est la que je sèche principalement.

    2.-
    comme le montre la boucle for:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for ( size_t Fa = 0; cT.Get2DRead(0,Fa,resData)== true ; ++Fa)
    resData doit être déclarer avant afin de recevoir le résulta. pas très pratique

    la question est donc comment déclarer la variable dans la boucle si cest possible ?,

    3.-une autre idée a creuser (plus dificile a expliquer)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bool cTableaux::Get2DRead(const int & IdTab,const int & NumLine, int & Data)
    je pourrait passer un tableau : resData[] , pour recupérer les valeur, mai la fonction perd en simpliciter.
    Si je voudrai recupérer les valeur du premier tableau il me faudrai alors changer les paramettre de la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bool cTableaux::Get2DRead(const int & IdTab,const int & IdTab2,const int & NumLine, ,const int & NumLine2, int & Data,int & Data2)
    mai à ce moment la il faut surcharger la fonction ... pas très pratique etc

    Si vous avez des idées je suis preneur

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Tableaux] tableau de deux dimention
    Par hadjiphp dans le forum Langage
    Réponses: 1
    Dernier message: 15/06/2009, 19h38
  2. manipulation des tableau de 2 dimention par c++ builder 5
    Par amel82 dans le forum C++Builder
    Réponses: 5
    Dernier message: 15/03/2009, 16h29
  3. tableau a double dimention
    Par fernier dans le forum VB.NET
    Réponses: 1
    Dernier message: 31/07/2008, 19h11
  4. tableau a 2 dimentions appelé dans une fonction
    Par epeichette dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 22/10/2007, 15h38
  5. Tableau 2 dimentions, pointeur
    Par DidierMesenbourg dans le forum C
    Réponses: 4
    Dernier message: 22/02/2005, 08h08

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