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 :

parcours d'une liste


Sujet :

SL & STL C++

  1. #1
    Candidat au Club
    Inscrit en
    Novembre 2008
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 9
    Points : 3
    Points
    3
    Par défaut parcours d'une liste
    bonsoir a tous.
    est ce qu'on pourrait parcourrir une liste de la stl sans utiliser un iterateur.

  2. #2
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    181
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 181
    Points : 199
    Points
    199
    Par défaut
    Nope, les itérateurs ont été justement conçus pour le parcours des conteneurs de la STL.
    Quel est le problème avec ta std::list ?

  3. #3
    Candidat au Club
    Inscrit en
    Novembre 2008
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    merci pour la reponse.

    le principe de la liste chainee,c'est qu'elle contient des noeuds,chaque noeud pointant vers le noeud suivant,chose qui assure ce chainage puisue le parcours se fait simplement via une methode qui ne fai qu'affecter au noeud courrant l'adresse du suivant de l'ex courrant.
    ma question est:
    est ce que la list de la stl n'est pas munie d'une telle methode next().
    Merci.

  4. #4
    Membre régulier Avatar de krieg
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    75
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 75
    Points : 92
    Points
    92
    Par défaut
    Salut,
    non, il n'y a pas de méthode next() sur les listes stl.
    mais tu peux creer une liste stl avec des element d'une classe dans laquel tu peux implanter ta méthode next().
    si tu souhaites en savoir plus :
    http://cpp.developpez.com/faq/cpp/?page=STL

    bye

  5. #5
    Candidat au Club
    Inscrit en
    Novembre 2008
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    merci pour la reponse.
    mais, je ne pense pas que le fait de munir les elements de la liste d'une telle methode marcherait.et je ne vois pas comment pourrait on concevoir cela.
    si par exemple on a une liste de points,sachant que point est defini dans une classe a part.
    implanter une methode next() pour la classe point n'aurait vraiment pas de signification.
    vous etes pas d'accord avec moi?

  6. #6
    Membre émérite

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Points : 2 252
    Points
    2 252
    Par défaut
    Citation Envoyé par monodev
    est ce que la list de la stl n'est pas munie d'une telle methode next().
    Si, en quelque sorte, par le biais d'un itérateur.
    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
     
    // Habituellement pour parcourir une liste on fait :
    Node * node = head;
    while(node)
    {
        node->DoStuff();
        node = node->next();
    }
     
    // Alors qu'avec la STL on fait :
    std::list<Point>::iterator it = liste.begin();
    while(it != liste.end()
    {
       it->DoStuff();
       it++;
    }
     
    // Ceci dit la notation usuelle, que tu retrouveras dans les tutos sur la STL est plutôt :
    for(std::list<Point>::iterator it = liste.begin() ; it != liste.end() ; ++it)
    {
       it->DoStuff();
    }
    liste.begin() est l'équivalent du pointeur de tête
    liste.end() est l'équivalent du pointeur null en fin de liste.
    it++ est l'équivalent de node = node->next();

  7. #7
    Candidat au Club
    Inscrit en
    Novembre 2008
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    merci pour la reponse.

  8. #8
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Ou encore, pour être 100% STL:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    std::for_each(
       liste.begin(),
       liste.end(),
       std::mem_fun_ref(&Point::DoStuff)
    );

  9. #9
    Membre émérite

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Points : 2 252
    Points
    2 252
    Par défaut
    mem_fun_ref c'est pour les low.
    Le true-STL-spirit c'est ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    std::for_each(liste.begin(), liste.end(), [](Point& p){p.DoStuff()});
    Lambdaaaa powwwwwwwwaaahh !!!

  10. #10
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par Arzar Voir le message
    mem_fun_ref c'est pour les low.
    Le true-STL-spirit c'est ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    std::for_each(liste.begin(), liste.end(), [](Point& p){p.DoStuff()});
    Lambdaaaa powwwwwwwwaaahh !!!
    C'est du boost pas du STL, non?

  11. #11
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    futur STL de C++0X avec les lambdas-expressions.

  12. #12
    Membre émérite

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Points : 2 252
    Points
    2 252
    Par défaut
    Garanti 100 % STL, dans quelques années
    Ceci dit, Visual studio 2010 aura les lambdas, et leur développement est en cours pour gcc.
    Et toujours à propos des lambdas, un des ingénieurs de Microsoft a pondu un post fantastique sur le blog de visual studio qui explique en détails la syntaxe et l'utilisation des lambdas d'une manière vraiment claire et pédagogique. Détail amusant, le post a été écrit par Stephan T. Lavavej, clairement l'homme de la situation!

  13. #13
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Citation Envoyé par Arzar Voir le message
    mem_fun_ref c'est pour les low.
    Le true-STL-spirit c'est ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    std::for_each(liste.begin(), liste.end(), [](Point& p){p.DoStuff()});
    Et cela rend le code plus lisible ?
    Ou alors, c'est sponsorisé par les laboratoires Boiron, parce que là, il faut un tube d'aspirine pour comprendre ce qui se passe

  14. #14
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Citation Envoyé par ram-0000 Voir le message
    Et cela rend le code plus lisible ?
    Ou alors, c'est sponsorisé par les laboratoires Boiron, parce que là, il faut un tube d'aspirine pour comprendre ce qui se passe
    Ca allège le code car ca évite d'écrire un foncteur.
    Par contre, j'admets que la syntaxe n'est pas des plus jolie, mais cela ne reste qu'une syntaxe et une fois le 1er choc passé, c'est simple et efficace

  15. #15
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 861
    Points
    11 861
    Par défaut
    Sinon, en rendant la lambda expr moins succinte, tu peux la rendre plus compréhensible.

    Par contre, je ne veux pas dire, mais next() ça revient à utiliser std::advance() en donnant 1 comme argument pour la "distance"...

  16. #16
    Membre expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Points : 3 266
    Points
    3 266
    Par défaut
    Citation Envoyé par ram-0000 Voir le message
    Et cela rend le code plus lisible ?
    Ou alors, c'est sponsorisé par les laboratoires Boiron, parce que là, il faut un tube d'aspirine pour comprendre ce qui se passe
    Faut voir plus loin que l'exemple donné; le code est nettement plus lisible lorsque l'expression n'est pas remplaçable par un mem_fun_ref ou autre binders, mais uniquement par une fonction/foncteur (tout en restant dans le cas de besoins triviaux et/ou locaux).

  17. #17
    Candidat au Club
    Inscrit en
    Novembre 2008
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    S'il vous plait,
    syntaxe de advance(),si c'est possible!!

  18. #18
    Membre expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Points : 3 266
    Points
    3 266
    Par défaut
    ça ?

    Edit: mais si tu ne veux vraiment pas utiliser les itérateurs pour quelque raison que ce soit (prof ?), bah, tu fais une bonne vieille boucle for

  19. #19
    Membre émérite

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Points : 2 252
    Points
    2 252
    Par défaut
    Monodev, deux adresses très pratiques :
    C++ reference
    Le site de SGI (pour la STL)

    Citation Envoyé par ram-0000
    Et cela rend le code plus lisible ?
    Ou alors, c'est sponsorisé par les laboratoires Boiron, parce que là, il faut un tube d'aspirine pour comprendre ce qui se passe.
    Héhéhé, bon c'est vrai que la première fois, ça fait un choc : "Mais qu'est ce que ce [] vient f***** là ?!?"

    Mais au final, oui je trouve ça pas si mal. Le parallèle entre fonction classique et lambda est très clair :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    foo(Point& p)
    {
       p.DoStuff();
    }
     
    [](Point& p)
    {
       p.DoStuff();
    }
     
    // d'ou le
    for_each(liste.begin(), liste.end(), [](Point& p) { p.DoStuff(); });
    L'avantage, c'est que l'on voit directement sur quoi l'on travaille (des Point&) et comment (p.DoStuff()). Plus besoin d'aller et venir pour vérifier la définition d'un foncteur, plus besoin de bind_mem_ptr_fun_2nd<std::unary_function> pour appeler des fonctions membres d'un objet, il y a quand même du progrès.

    Citation Envoyé par Alp
    Sinon, en rendant la lambda expr moins succinte, tu peux la rendre plus compréhensible.
    Ben, je préfère quand même les lambdas très simple, que l'on peut "parser" en un coup d'œil, mais c'est vrai que les exemples données dans l'article du blog de vs utilisent une mise en page sur plusieurs lignes qui donnent une assez bonne lisibilité:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    std::vector<int> v = {10, 2, 13, 4, 5};
    int x = 1;
    int y = 1;
    for_each(v.begin(), v.end(), [&](int& r) 
    {
       const int old = r;
       r *= x * y;
       x = y;
       y = old;
    });
    Ceci dit, dès que ça se complique un peu, ça devient très vite assez perturbant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    std::erase(remove_if(v.begin(), v.end(), [](Point& p) {
       p.Update();
       if(p.Valid() == false)
          return true;
       return false;
    }), v.end());

  20. #20
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Citation Envoyé par ram-0000 Voir le message
    Et cela rend le code plus lisible ?
    Pour un for_each, pas vraiment à mon sens. En tout cas moins que (puisqu'on reste en C++0x) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for (Point&p : liste)
    {
        p.doStuff();
    }
    Par contre, pour d'autres algorithmes, comme un remove_each, un sort,... ça le deviens à mon sens.
    Citation Envoyé par ram-0000 Voir le message
    Ou alors, c'est sponsorisé par les laboratoires Boiron, parce que là, il faut un tube d'aspirine pour comprendre ce qui se passe
    Vu que Boiron, c'est de l'homéopathie, c'est à dire de l'eau sucrée, c'est que ce n'est pas si prise de tête que ça...

Discussions similaires

  1. script de parcours d'une liste de valeurs
    Par sallemel dans le forum Linux
    Réponses: 4
    Dernier message: 09/11/2010, 18h57
  2. Parcours d'une liste dans DisplayTag
    Par riderfun dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 26/03/2010, 09h39
  3. Boucle infinie lors d'un parcours d'une liste
    Par cocosql dans le forum Prolog
    Réponses: 3
    Dernier message: 16/01/2009, 07h23
  4. parcours d une liste de données.
    Par Mobistar dans le forum Collection et Stream
    Réponses: 16
    Dernier message: 08/08/2008, 13h33
  5. Parcours d'une liste de liste
    Par pagra dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 10/10/2007, 19h24

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