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 :

Piles et itérateur


Sujet :

C++

  1. #21
    Membre Expert Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Par défaut
    Tout d'abord pourquoi faire deux boucles ? Et sinon au lieu de commencer par la fin, tu peux simplement utiliser un reverse iterator, à savoir it = pile.rbegin(). Sinon je ne pense pas que c'est une bonne idée d'appeler ton deque pile, parce que ça n'en est pas une et ça prête à confusion.

    Dans tes deux boucles tu dois quand même vérifier que tu n'as pas parcouru toute la structure au cas où a >= pile.size(). (Tu peux utiliser pile.rend() pour la fin reverse).

    Et finalement pour répondre à ta question, hé bien oui c'est normal, car tu fais qui est une affectation..

    D'ailleurs évite de faire *(itend-i) et incrémente plutôt ton itérateur à chaque itération.

  2. #22
    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
    Sinon tu pouvais passer un peu de temps à éplucher la STL et tomber là-dessus :
    http://www.cplusplus.com/reference/s...ic/accumulate/

    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
    #include <cassert>
    #include <numeric>
     
    void MyStackClass::SUM(int a)
    {
    	// On vérifie qu'un a-ième élément existe dans la pile
    	assert ( 0 < a && a <= pile.size() );
     
    	// On fait la somme des a premiers éléments
    	int sum = std::accumulate(pile.begin(), pile.begin() + a);
     
    	// On vide la pile, on y ajoute sum
    	pile.clear();
    	pile.push_back(sum);
    }

  3. #23
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2012
    Messages : 17
    Par défaut
    Ouai mais c'est une pile qui y est utilisé non ?

  4. #24
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2012
    Messages : 17
    Par défaut
    Trademark après modifs ça donne ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void SUM(int a){ std::deque<int>::reverse_iterator itend=pile.rbegin();
    				if (a <= pile.size()){
    				int s=0;
    				for(int i=1;i==a;i++){ s+= *(itend++) ;pile.pop_back();}
    				pile.push_back(s);}
    				else cout<<"pile trop courte";}
    Mais ça ne somme pas... peut être ai je mal compris le fonctionnement des reverse iterator... Il partent bien du dernier élément et lorsqu'on l'incrémente il se rapproche du premier

  5. #25
    Membre Expert Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Par défaut
    Citation Envoyé par cob59 Voir le message
    Sinon tu pouvais passer un peu de temps à éplucher la STL et...
    J'y ai pensé aussi mais en fait il faut qu'il somme les n valeurs du dessus de la pile, vider ces n valeurs (et pas toutes la pile) et ajouter la somme calculée.

    Mais ça ne somme pas... peut être ai je mal compris le fonctionnement des reverse iterator... Il partent bien du dernier élément et lorsqu'on l'incrémente il se rapproche du premier
    Tant que 1 est égale à 5 (si a vaut 5) faire ... Donc j'imagine que tu as compris le soucis.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if (a <= pile.size()){
    Ce n'est pas spécialement une bonne idée d'afficher un message, je vois deux façons, soit tu fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    a = std::min(a, pile.size());
    Ou alors tu lance une exception. Mais faire une erreur silencieuse comme ça n'est probablement pas adéquat. Si tu utilises la première méthode, pense bien à le commenter.

  6. #26
    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
    OK. Dans ce cas ça fait faire une petite modif :

    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
    #include <cassert>
    #include <numeric>
     
    void MyStackClass::SUM(int a)
    {
    	// On vérifie qu'un a-ième élément existe dans la pile
    	assert ( 0 < a && a <= pile.size() );
     
    	// On fait la somme des a derniers éléments
    	int sum = std::accumulate(pile.end() - a, pile.end());
     
    	// On dépile, on ajoute sum
    	pile.erase(pile.end() - a, pile.end());
    	pile.push_back(sum);
    }

  7. #27
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2012
    Messages : 17
    Par défaut
    Euh non, je ne comprends pas trademark...

    n'est pas "Tant que 1 est égale à 5 (si a vaut 5) faire..." mais plutôt "pour i=1 jusqu'à i=5 faire....(incrémenter i)"

  8. #28
    Membre Expert Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Par défaut
    Les boucles for sont pareils que les boucles while, c'est des "Tant que" et pas jusqu'à.

    Donc ça donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for(int i=0;i < a; ++i, ++it)
    { 
      sum += *it ;
      pile.pop_back();
    }
    Tu peux également utiliser la méthode présentée par cob59 mais tu auras du O(2a) au lieu de O(a), ce qui est parfois négligeable.

  9. #29
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2012
    Messages : 17
    Par défaut
    Aie aie aie des petites lacunes

    Mais bonne nouvelle ma pile est finie Merci à vous....

  10. #30
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 274
    Par défaut
    Salut je pense pouvoir t'aider

    Plusieurs erreurs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void SUM(int a){ std::deque<int>::const_iterator itend=pile.end();
    				int s=0;
    				for(int i=1;i!=a;i++) s= s + *(itend-i);
    				for(int j=1;j!=a;j++) pile.pop_back();
    				pile.push_back(s);}
    Après le code peut être un minimum optimisé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    void SUM(int a)
            {
                double s=0;
                for(int i=(int)T.size()-1;i>=(int)T.size()-a&&i>=0;i--)
                    s+=T[i];
     
                if(a<A)
                    T.erase(T.end()-a,T.end());
                else
                    T.erase(T.begin(),T.end());
                T.push_back(s);
            }
    Voila

    Edit : je n'avais pas vu qu'il y avait une deuxième page sur ce forum donc je suis multi grillé

Discussions similaires

  1. Voir la pile FPU
    Par Qwazerty dans le forum Assembleur
    Réponses: 5
    Dernier message: 11/05/2003, 15h09
  2. Créer des objets sur la pile ?
    Par Cornell dans le forum Langage
    Réponses: 8
    Dernier message: 03/03/2003, 11h47
  3. Etat de la pile sous Linux et Windows
    Par Bibouda dans le forum x86 32-bits / 64-bits
    Réponses: 7
    Dernier message: 16/02/2003, 01h28
  4. La mémoire en Pmode et en Rmode - la pile
    Par le mage tophinus dans le forum Assembleur
    Réponses: 15
    Dernier message: 16/02/2003, 01h00
  5. [TASM] Déclarer le segment de pile
    Par cipher dans le forum x86 16-bits
    Réponses: 2
    Dernier message: 01/10/2002, 03h58

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