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 :

[C++] Parcourir une vector 2D avec un for_each


Sujet :

C++

  1. #1
    Expert confirmé
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Points : 4 388
    Points
    4 388
    Par défaut [C++] Parcourir une vector 2D avec un for_each
    Bonsoir à tous,

    Je me suis mis récemment au for_each, et je n'arrive pas à parcourir mon vector 2D pour libérer les ressources en mémoire.
    Soit la déclaration suivante :
    vector< vector<BITMAP*> > tableau;
    Je souhaiterais appliquer la fonction "libererBitmap" à tous les éléments du vector 2D avec des for_each sans boucles for...

    Pour libérer la mémoire avec un vector 1D, j'utilise un foncteur de la manière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    struct DeleteBitmapVector
    {
        template <class T> void operator()(T& p) const
    	{
    	    libererBitmap(p);
    	}
     
    };
    // plus loin
    for_each(tableau1D.begin(), tableau1D.end(), DeleteBitmapVector());
    Je voudrais la même chose en 2D

    Merci à tous et bonne soirée !
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

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


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

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 858
    Points : 218 577
    Points
    218 577
    Billets dans le blog
    120
    Par défaut
    Bonsoir,

    Je doute que ce soit vraiment beaucoup mieux qu'un double for ... mais bon.
    Dans la théorie (car je n'ai jamais tenté de code de ce genre), cela serait:

    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
     
    struct DeleteBitmap
    {
        template <class T> void opertor()(T& p) const
        {
            libererBitmap(p);
        }
    }
     
    struct DeleteBitmapVector
    {
        template <class T> void operator()(T& p) const
        {
            for_each(p.begin(), p.end(), DeleteBitmap();
        }
    };
    // plus loin
    for_each(tableau2D.begin(), tableau2D.end(), DeleteBitmapVector());
    Petite explication.
    Nous avons un tableau 2D, qui est un std::vector d'un std::vector de Bitmap*. En code: std::vector< std::vector < Bitmap* > > myTab2D;Donc, lors du premier for_each() (celui du tableau 2D), il va parcourir tout les éléments, qui sont des tableau (1D) de Bitmap* -> [codeinline]std::vector < Bitmap* >[codeinline]
    Donc, il faut encore parcourir le tableau, afin de liberer tout les pointeurs. Donc j'utilise un nouveau for_each().

    Voilà tout, je pense.
    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
    Expert confirmé
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Points : 4 388
    Points
    4 388
    Par défaut
    C'est bien ce que je pensais, je voulais l'avis des autres vu mon niveau pathétique en C++

    Bah je suis d'accord avec toi, une double boucle for suffirais mais il parait qu'il faut pas avec les vectors d'apfès la faq :
    http://cpp.developpez.com/faq/cpp/?p...elete_sequence

    Perso, je ne vois pas la différence mais bon

    Merci !
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

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


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

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 858
    Points : 218 577
    Points
    218 577
    Billets dans le blog
    120
    Par défaut
    Euh, dans cette FAQ, je ne vois pas ce qui dit qu'il faut mieux utiliser un for_each que un for avec des iterateurs.
    Je connais un cas, ou les iterateurs sont un peu plus compliqué à gerer (car de la suppression d'element du vecteur lors du parcours). Mais sinon ... le for suffira je pense.
    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
    Expert confirmé
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Points : 4 388
    Points
    4 388
    Par défaut
    Citation Envoyé par LittleWhite Voir le message
    Euh, dans cette FAQ, je ne vois pas ce qui dit qu'il faut mieux utiliser un for_each que un for avec des iterateurs.
    Je connais un cas, ou les iterateurs sont un peu plus compliqué à gerer (car de la suppression d'element du vecteur lors du parcours). Mais sinon ... le for suffira je pense.
    Oui on ne dit pas ce qui est le mieux mais vu que c'est cette méthode qui est fournis, voilà pourquoi je l'ai adopté sans savoir vraiment pourquoi
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  6. #6
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Un double BOOST_FOR_EACH serait plus lisible.
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  7. #7
    Membre éprouvé Avatar de oxyde356
    Homme Profil pro
    Ingénieur Recherche Imagerie
    Inscrit en
    Février 2006
    Messages
    797
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Recherche Imagerie

    Informations forums :
    Inscription : Février 2006
    Messages : 797
    Points : 1 087
    Points
    1 087
    Par défaut
    Citation Envoyé par Goten Voir le message
    Un double BOOST_FOR_EACH serait plus lisible.
    +1

  8. #8
    Expert confirmé
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Points : 4 388
    Points
    4 388
    Par défaut
    Citation Envoyé par Goten Voir le message
    Un double BOOST_FOR_EACH serait plus lisible.
    Sauf que je n utilise pas boost
    D'ailleurs sincèrement qu'est ce que ça a de mieux cette librairie ? (je sens que je vais me faire lyncher )
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  9. #9
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 156
    Points
    3 156
    Par défaut
    Citation Envoyé par Aspic Voir le message
    D'ailleurs sincèrement qu'est ce que ça a de mieux cette librairie ? (je sens que je vais me faire lyncher )
    Pour dire si c'est mieux, il faudrait déjà savoir avec quoi tu le compares . Si le compares à rien (la STL seule), c'est mieux dès lors que tu en as l'utilité. Dans ton cas, un boost foreach serait en effet sympa, mais ça te rajoute une dépendance. C'est un choix à faire, comme toujours...

    Si le sujet t'intéresse, il y a un débat ici.
    Find me on github

  10. #10
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Citation Envoyé par Aspic Voir le message
    Sauf que je n utilise pas boost
    D'ailleurs sincèrement qu'est ce que ça a de mieux cette librairie ? (je sens que je vais me faire lyncher )

    Mieux que quoi?
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  11. #11
    Expert confirmé
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Points : 4 388
    Points
    4 388
    Par défaut
    Citation Envoyé par Goten Voir le message
    Mieux que quoi?
    Je pensais comparer à un conteneur standard de la STL comme un vector voire une map puisque dans mon appli je n'utilise que ce genre de conteneur...
    Si le compares à rien (la STL seule), c'est mieux dès lors que tu en as l'utilité. Dans ton cas, un boost foreach serait en effet sympa, mais ça te rajoute une dépendance.
    Après on parle d'ajouter des dépendances ? Qu'entendez vous par cela ? (est ce uniquement l'ajout d'une librairie externe ou y'a autre chose...)
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  12. #12
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 156
    Points
    3 156
    Par défaut
    Citation Envoyé par Aspic Voir le message
    Je pensais comparer à un conteneur standard de la STL comme un vector voire une map puisque dans mon appli je n'utilise que ce genre de conteneur...
    boost foreach s'utilise sur des conteneurs de la STL ...

    Citation Envoyé par Aspic Voir le message
    Après on parle d'ajouter des dépendances ? Qu'entendez vous par cela ? (est ce uniquement l'ajout d'une librairie externe ou y'a autre chose...)
    Oui c'est une dépendance car tu as besoin de Boost pour compiler ton projet.
    Find me on github

  13. #13
    Membre éclairé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2007
    Messages
    373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2007
    Messages : 373
    Points : 764
    Points
    764
    Par défaut
    Sinon tu as un compromis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #define foreach(iter, container) for ((iter) = (container).begin(); (iter) != (container).end(); ++(iter))
     
    vector< vector<BITMAP*> > tableau;
     
    vector< vector<BITMAP*> >::iterator iter1;
    vector<BITMAP*>::iterator           iter2;
     
    foreach (iter1, tableau)
    foreach (iter2, *iter1)
    {
        libererBitmap(*iter2);
    }

  14. #14
    Expert confirmé
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Points : 4 388
    Points
    4 388
    Par défaut
    ok merci pour vos éclairements
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

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

Discussions similaires

  1. Parcourir une liste pucée avec les touches directionnelles
    Par hukiro dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 13/04/2013, 19h22
  2. Réponses: 3
    Dernier message: 30/01/2013, 14h38
  3. [JDOM] Parcourir une arborescence XML avec JDom
    Par sousou_ dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 17/08/2009, 10h38
  4. Parcourir une image 3D avec un cube
    Par adriangarello dans le forum Images
    Réponses: 5
    Dernier message: 16/05/2008, 14h41
  5. Comment parcourir une ficher word avec VBA?
    Par megapacman dans le forum VBA Word
    Réponses: 6
    Dernier message: 17/11/2006, 11h11

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