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 :

Insertion dans un tableau deux dimensions vector<>


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 36
    Par défaut Insertion dans un tableau deux dimensions vector<>
    Bonjour,

    Donc le problème est le suivant :

    J'ai créé un tableau 2 dimensions afin de contenir des pointeurs vers une classe Item. ce qui donne donc :

    std::vector<std::vector<Item *>> tableau;

    Jusque là je pense que c'est bon.

    Le problème est que ce tableau est amené a s'aggrandir ou à diminuer au cours du programme.

    - Pour l'initialisation comment dois-je faire dans un premier temps pour allouer un tableau de taille ROW x COL ???
    Je vois comment le faire pour un tableau vector une dimension mais là j'avoue que je bloque (surement bètement) sur la double allocation.

    Enfin deuxième question :

    - Si je souhaites insérer un Item* à un endroit bien précis au milieu de mon tableau d'Item*, comment dois-je procéder ?
    Je sais qu'on peut insérer à la fin au début, mais je n'ai pas vu de méthode pour un insérer à un endroit précis sans effacer quoique ce soit (je veux juste décalé le reste)

    Soyez indulgent je découvre la STL et le vector<>...

    Merci par avance pour votre aide.

  2. #2
    Membre éclairé Avatar de befalimpertinent
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    561
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Avril 2007
    Messages : 561
    Par défaut


    1) Pour gérer une matrice ROW x COL un vector<vector<> > n'est pas le mieux adapté. Ne peux tu pas te contenter d'un vecteur 1 dimension et gérer toi même l'indexage tableau[i + j*nb_col] ?
    (ou cf eviter tableau tableau pour une matrice )

    2) Tu as la méthode insert pour un vector. Mais la encore méfies-toi : le vector est optimisé pour ajouter en fin (push_back) donc si tu fais beaucoup d'insertions vector n'est peut etre pas le meilleur container (voir std::List peut être)
    (cf choix container)

  3. #3
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Un vecteur de vecteur, c'est une matrice... Et c'est tout de suite plus compliqué à gérer...
    Soit:
    1) Tu cherches à apprendre, alors peut être tu pourrais coder toi même une classe Matrice dans laquelle tu définirais les bons opérateurs etc... pour les besoins de ton application
    2) Tu ne veux pas réinventer la roue, et donc tu peux utiliser une des nombreuses bibliothèques de matrices déjà existantes...

    La deuxième solution me parait bien, car les bonnes bibliothèques sont à base de template, d'itérateurs, bref, dans le moule "C++". Et ça c'est important.
    Par exemple, Boost.ublas, Vigra, Blitz++, etc... il y a en a la pelle

    Bonne continuation!

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Par exemple, Boost.ublas, Vigra, Blitz++, etc... il y a en a la pelle
    Ca ce sont des matrices mathématiques (et je ne pense pas qu'il ait besoin de diagonaliser ses matrices d'Item*, ou de calculer leur déterminant ).
    Pour des tableaux à deux dimensions il vaudra mieux prendre des choses du style boost.multiarray.

  5. #5
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    +1

  6. #6
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 36
    Par défaut
    Effectivement mes besoins sont assez simple, j'ai juste besoin d'organiser mes item* dans une grille 2 dimensions et de pouvoir en inserer ou en retirer à des endroits précis...

    Il me parait un peu périlleux de gérer ça dans un conteneur 1 dimension...

    Je ne connais pas du tout boost.multiarray mais s'il permet de faire ce que je veux je vais essayer de me documenter dessus...

    Si entre temps vous avez d'autres idées pour résoudre mon problème je suis preneur...

    Merci déjà pour votre aide

  7. #7
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 36
    Par défaut
    Bon finalement je reviens à la charge...

    Je ne trouve pas grand chose sur boost.multi_array... Pourriez vous me conseiller de la doc ou des tutos ???

    Encore merci.

  8. #8
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Je ne trouve pas grand chose sur boost.multi_array...
    T'as vraiment cherché ? On ne peut vraiment pas le louper sur Google, ou sur le site officiel de boost.

    http://www.boost.org/libs/multi_array/doc/index.html

    Sinon, une gestion avec un tableau à une dimension n'est pas si périlleuse, à partir du moment où tu encapsules bien les quelques opérations de base qui nécessiteront des accès direct au tableau.

  9. #9
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 36
    Par défaut
    J'ai cherché boost.multi_array en français c'est pour ça je crois...

    Sinon je vais bien voir ce qui est le moins lourd à mettre en place mais c'est vrai qu'en y réfléchissant ça serait ptetre pas plus mal à une dimension.

    En tout cas merci...

  10. #10
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Prend boost::multiarray.
    Ca sera vraiment plus rapide et plus clair. Même si je dois avouer que pour un débutant c'est pas toujours évident de s'y retrouver dans la programmation générique.
    Tu as tout à gagner à essayer. Et à force de l'utiliser, tu vas trouver ça hyper simple...

  11. #11
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 36
    Par défaut
    Effectivement le tableau à une dimension est une bonne solution... Seulement il faut quand même que je le gère sous forme de std::vector<> vu que ça taille est amené à être variable, non ???

    Je ne peux pas faire un simple itemTable = new Item[row*col]; ???

  12. #12
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Citation Envoyé par BigWill Voir le message
    Effectivement le tableau à une dimension est une bonne solution... Seulement il faut quand même que je le gère sous forme de std::vector<> vu que ça taille est amené à être variable, non ???

    Je ne peux pas faire un simple itemTable = new Item[row*col]; ???
    Tu peux, mais si std::vector existe c'est pour te simplifier les choses, alors tu as tout intérêt à l'utiliser.

  13. #13
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 36
    Par défaut
    Est-ce que les fonctions insert tel que iterator
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    insert(iterator pos, const T& x)
    décale les autres éléments puis insère le nouvel élément ou alors tout simplement elle écrase l'élément présent à la position pos pour insérer le nouvel élément x ???

  14. #14
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    elle insère, sans rien effacer...
    Par contre, cette fonction n'est pas très optimisée pour un vector...
    C'est mieux avec une std::list si tu comptes faire beaucoup d'insertions.

  15. #15
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 36
    Par défaut
    J'ai une nouvelle question, j'espère la dernière...

    J'ai créé un tableau std::vector<Item *> tableau;

    et je voudrais retourné l'adresse de ce tableau pour le manipuler...

    mais quelle doit etre le type de retour de ma fonction ?

    je doute que ce soit ou alors ???

  16. #16
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    std::vector<Item *> * MaFontion()
    {
        // ...
        std::vector<Item*> tableau;
        //
        return &tableau;
    }
    Question : pourquoi ne pas utiliser le passage par référence? (cf faq)

  17. #17
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 36
    Par défaut
    Tout simplement lolol...

    Merci bien encore une fois.

  18. #18
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 36
    Par défaut
    Encore une fois...

    La fonction erase de vector elle supprime et décale tous les éléments ou alors elle laisse une case vide ???

  19. #19
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Elle ne laisse pas de case vide, les éléments sont décalés.

  20. #20
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 36
    Par défaut
    Parfait, merci.

Discussions similaires

  1. Mettre un fichier csv dans un tableau à deux dimensions
    Par neeux dans le forum Général Python
    Réponses: 5
    Dernier message: 05/03/2007, 16h36
  2. Réponses: 6
    Dernier message: 25/02/2007, 17h56
  3. Réponses: 9
    Dernier message: 05/01/2007, 20h04
  4. Rechercher dans un tableau deux dimensions
    Par angelevil dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 28/09/2006, 20h29
  5. tri alphabétique dans un tableau deux dimensions
    Par *!!cocco!!* dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 06/12/2004, 21h38

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