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 :

API de <list> c++ !


Sujet :

C++

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 126
    Points : 48
    Points
    48
    Par défaut API de <list> c++ !
    Bonjour,

    Je vous remercie par avance si vous comptez lire ce message et encore plus si vous pensez y répondre !

    J'ai eu un problème aujourd'hui (enfin deux) avec la bibliothèque <list> de la stdl en c++

    Voici ce qui s'est passé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void remettre_cartes(list<string>& cards, list<string>& in_play){
        for(auto it = in_play.cbegin(); it != in_play.cend(); ++it){
            string c = *it;
            cards.push_back(c);
        }
        in_play.clear();
    }
    n'a pas le même comportement que

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void remettre_cartes(list<string>& cards, list<string>& in_play){
        for(int i = 0; i < in_play.size(); i++){
            string c = in_play.front();
            cards.push_back(c);
            in_play.pop_front();
        }
    }
    De là où je me tiens (et votre mission si vous l'acceptez consiste à m'expliquer en quoi je me trompe ! ), dans le second code, le premier élément de la liste devrait être supprimé de in_play et rajouté dans cards à chaque tour de boucle jusqu'à ce que in_play soit vide, or dans la pratique il m'a ajouté 4 fois la même string (in_play.size() == 4 à ce moment là)

    Quelqu'un sait-il pourquoi ? Merci

  2. #2
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 648
    Points
    7 648
    Par défaut
    Bonjour,

    Je vois bien un problème dans le second code, mais pas celui là.
    La boucle n'est parcourue qu'à moitié (à chaque itération i augment de 1 et la taille diminue d'autant)
    j'écrirais plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while ( !in_play.empty() ) { ...
    Mais existe bien d'autre manières de parcourir une liste.

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 126
    Points : 48
    Points
    48
    Par défaut
    Merci beaucoup

  4. #4
    Membre habitué
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Février 2013
    Messages : 70
    Points : 146
    Points
    146
    Par défaut
    Je suis d'accord avec l'utilisation de la boucle while.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void remettre_cartes(list<string>& cards, list<string>& in_play){
        for(int i = 0; i < in_play.size(); i++){ // cette taille n'est pas constante
            string c = in_play.front();
            cards.push_back(c);
            in_play.pop_front(); //La taille diminue de 1
        }
    }

    On peut aussi corriger le nombre d'itérations de cette manière.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    const unsigned TailledeLaListe=in_play.size(); // une constante
    for(int i = 0; i < TailledeLaListe; i++)

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 126
    Points : 48
    Points
    48
    Par défaut
    J'avais compris comment fix le problème immédiatement après ton explication !

    Oui je n'ai pas bien fait attention à ça...

    Merci beaucoup à vous deux

  6. #6
    Expert confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Points : 4 442
    Points
    4 442
    Par défaut
    Une autre solution est d'utiliser splice.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void remettre_cartes(list<string>& cards, list<string>& in_play) {
        cards.splice(cards.end(), in_play);
    }

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

Discussions similaires

  1. API C et listes
    Par fred1599 dans le forum Interfaçage autre langage
    Réponses: 0
    Dernier message: 30/12/2012, 00h28
  2. Réponses: 4
    Dernier message: 27/10/2011, 15h06
  3. liste api
    Par herzleid dans le forum Windows
    Réponses: 7
    Dernier message: 18/02/2008, 17h15
  4. [VB.NET] Listing d'un répertoire par FTP avec API
    Par joefou dans le forum VB.NET
    Réponses: 1
    Dernier message: 16/12/2005, 15h29
  5. [SHELL API] Liste des Icônes dans le casier (et position)..
    Par ARDILLER dans le forum API, COM et SDKs
    Réponses: 4
    Dernier message: 07/05/2005, 13h37

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