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 :

Boucle avec un SET


Sujet :

C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2011
    Messages : 18
    Points : 15
    Points
    15
    Par défaut Boucle avec un SET
    Salut,
    J'ai vraiment besoin de votre aide !!! je voudrais faire une boucle pour afficher les éléments d'un SET mais ça ne fonctionne pas

    L'objectif c'est comme faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for (i = 0, i < TailleSet, i ++)
        for (j = i+1, j < TailleSet, j ++)
            for (k = j+1 , k < TailleSet, k ++)
                for (l = k+1 , l < TailleSet, l ++)
                    Afficher Set(Element)
    J'ai fait des recherches et j,ai trouvé qu'on devait utiliser un iterator mais je sais pas comment l'utiliser pour avoir le résultat ci-dessus.

    comment écrire j = i +1 avec un iterateur ?
    Merci beaucoup de votre aide !

  2. #2
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut!

    J'avoue ne déjà pas très bien comprendre le but de la manoeuvre : est tu conscient que, pour un set de 10 éléments à peine, tu vas en réalité afficher 10 x 9 x 8 fois les 7 derniers même éléments

    Même s'il ne s'agissait pas d'un affichage, ce n'est sans doute pas vraiment ce que tu souhaites effectivement faire

    Autrement, les itérateurs (constant, vu qu'on parle d'un set et que l'élément contenu est la clé) s'utilisent exactement comme des compteurs, "simplement" on les teste sur un "différent de la fin de la collection":
    /* par facilité pour éviter se répéter trop souvent */
    typedef std::vector<monType>::const_iterator const_iterator;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(const_iterator it=monSet.begin(); it!=monSet.end();++it)
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2011
    Messages : 18
    Points : 15
    Points
    15
    Par défaut merci pour ta reponse koala
    Le but est justement de faire une combinaison sans repetition de 4 éléments parmi n (la taille de mon tableau).

    comment incrémenter l'itérateur suivant (const_iterator)?

    exemple avec for, au debut de la boucle:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for (i=0; i < n;++i) //  i vaut 0 
     for (ji=i; ji < n;++ji) //  ji vaut 1
      for (ki=ji; ki < n;++ki) //  ki vaut 2
        for (yi=ki; yi < n;++yi) //  yi vaut 3
    avec ABCDEFG, ça donnerait ABCD, ABCE, ABCF, ABCG etc....

    je prends note de tester avec n'est pas égal au end du Set

    Merci

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Ben au lieu de bosser avec des entiers i ou j, tu bosses avec des itérateurs.

  5. #5
    Membre éclairé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 426
    Points : 827
    Points
    827
    Par défaut
    Salut,

    Je comprend mal, c'est ça que tu recherche? :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for(const_iterator iti=monSet.begin();         iti !=monSet.end();++iti)
         for(const_iterator itji=iti+1;            itji!=monSet.end();++itji)
              for(const_iterator itki=itji+1;      itki!=monSet.end();++itki)
                   for(const_iterator ityi=itki+1; ityi!=monSet.end();++ityi) {
                   //...
                   }
    Il faut vérifier avant que la taille de ton container ( monSet ) est >= 4 avant de lancer les boucles

  6. #6
    Membre averti
    Profil pro
    professeur des universités à la retraite
    Inscrit en
    Août 2008
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : professeur des universités à la retraite

    Informations forums :
    Inscription : Août 2008
    Messages : 364
    Points : 439
    Points
    439
    Par défaut
    Un itérateur sur un set ne se prête pas à l'arithmétique des pointeurs, si j'ai bonne mémoire !

  7. #7
    Membre éclairé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 426
    Points : 827
    Points
    827
    Par défaut
    Bonsoir,

    Citation Envoyé par ptyxs Voir le message
    Un itérateur sur un set ne se prête pas à l'arithmétique des pointeurs, si j'ai bonne mémoire !
    Tu n'as pas bonne mémoire! Par exemple, ce petit bout de code fonctionne très bien :
    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
    #include <iostream>
    #include <set>
     
    using namespace std;
     
    void main ()
    {
      set<int> monSet;
     
      // set some initial values:
      for (int i=1; i<=5; i++)
    	  monSet.insert(i*10);    // set: 10 20 30 40 50
     
      for ( set<int>::iterator it = monSet.begin(); it != monSet.end(); ++it )
    	  cout << *it << endl;
     
      system ("pause");
    }
    Les conteneurs associatifs ( set, multiset, map, multimap ) sont ordonnés intrinsèquement selon une relation d'ordre : ce qui permet leurs parcours par itérateur

    La relation d'ordre par défaut est <, mais elle peut être définie à la construction ( voir les exemples d'utilisation du constructeur )

  8. #8
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par bertry Voir le message
    Tu n'as pas bonne mémoire! Par exemple, ce petit bout de code fonctionne très bien
    Mais, dans le cas d'un itérateur, ++it peut être valide sans que it+1 le soit or la syntaxe it+1 est bien présente dans le code concerné. C'est à ceci, je pense, que ptyxs faisait allusion.
    Et il me semble bien qu'il ait raison, les itérateurs sur les set n'étant pas des random iterators.

    Citation Envoyé par bertry Voir le message
    La relation d'ordre par défaut est <, mais elle peut être définie à la construction ( voir les exemples d'utilisation du constructeur )
    Elle peut aussi être définie directement via le paramètre template correspondant (ce qui me semble être une pratique plus fréquente que l'utilisation du constructeur qui nécessite d'ailleurs de changer le paramètre template en question).

  9. #9
    Membre éclairé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 426
    Points : 827
    Points
    827
    Par défaut
    Citation Envoyé par gl Voir le message
    Mais, dans le cas d'un itérateur, ++it peut être valide sans que it+1 le soit or la syntaxe it+1 est bien présente dans le code concerné. C'est à ceci, je pense, que ptyxs faisait allusion.
    Et il me semble bien qu'il ait raison, les itérateurs sur les set n'étant pas des random iterators.
    Merci pour la précision, je viens de tester, et à ma grande surprise, ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    set<int>::iterator itDébut = monSet.begin();
      for ( set<int>::iterator it = itDébut+1; it != monSet.end(); ++it )
    	  cout << *it << endl;
    ne passe pas à la compilation. Le itDébut+1 est refusé alors que le ++it est accepté!

  10. #10
    Membre averti
    Profil pro
    professeur des universités à la retraite
    Inscrit en
    Août 2008
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : professeur des universités à la retraite

    Informations forums :
    Inscription : Août 2008
    Messages : 364
    Points : 439
    Points
    439
    Par défaut
    Citation Envoyé par ptyxs Voir le message
    Un itérateur sur un set ne se prête pas à l'arithmétique des pointeurs, si j'ai bonne mémore !
    Citation Envoyé par bertry
    Tu n'as pas bonne mémoire! Par exemple, ce petit bout de code fonctionne très bien :
    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
     
    #include <iostream>
    #include <set>
     
    using namespace std;
     
    void main ()
    {
      set<int> monSet;
     
      // set some initial values:
      for (int i=1; i<=5; i++)
    	  monSet.insert(i*10);    // set: 10 20 30 40 50
     
      for ( set<int>::iterator it = monSet.begin(); it != monSet.end(); ++it )
    	  cout << *it << endl;
     
      system ("pause");
    }
    Ben si. Par 'arithmétique des pointeurs', on entend des opérations comme
    it + 1
    it -45
    etc. donc des opérations 'arithmétiques', et non pas l'opérateur ++it (aucun rapport avec ton bout de code, par conséquent).

    EDIT :
    Voir :
    http://www.cplusplus.com/reference/s...ionalIterator/

    http://www.cplusplus.com/reference/s...ccessIterator/

    http://www.cplusplus.com/reference/stl/set/

    http://stackoverflow.com/questions/4...s-not-possible

  11. #11
    Membre éclairé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 426
    Points : 827
    Points
    827
    Par défaut
    Citation Envoyé par bertry Voir le message
    Merci pour la précision, je viens de tester, et à ma grande surprise, ce code ne passe pas à la compilation. Le itDébut+1 est refusé alors que le ++it est accepté!
    Oui, oui, oui, c'est compris!! merci

  12. #12
    Membre éclairé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 426
    Points : 827
    Points
    827
    Par défaut
    Euh, alors, sinon, pour me faire pardonner :
    Citation Envoyé par apprentie2011 Voir le message
    comment écrire j = i +1 avec un iterateur ?
    Puisque on ne peut pas faire it+1 sur un set on peut ruser en utilisant seulement des ++it :
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    #include <iostream>
    #include <set>
     
    using namespace std;
     
    void main ()
    {
    	set<int> monSet;
     
    	// set some initial values:
    	for (int i=1; i<=6; i++)
    		monSet.insert(i*10);    // set: 10 20 30 40 50 60
     
    	set<int>::iterator itDébut;
     
    	for(set<int>::iterator iti = monSet.begin(); iti !=monSet.end(); ++iti) {
    		itDébut = iti;
    		if ( ++itDébut != monSet.end() ) {
    			for(set<int>::iterator itji = itDébut; itji!=monSet.end();++itji) {
    				itDébut = itji;
    				if ( ++itDébut != monSet.end() ) {
    					for(set<int>::iterator itki = itDébut;      itki!=monSet.end();++itki) {
    						itDébut = itki;
    						if ( ++itDébut != monSet.end() ) {
    							for(set<int>::iterator ityi = itDébut; ityi!=monSet.end();++ityi) {
    								cout << *iti << " " << *itji << " " << *itki << " " << *ityi << endl;
    							}
    						}
    						cout << endl;
    					}
    				}
    				cout << endl;
    			}
    		}
    		cout << endl;
    	}
     
    	system ("pause");
    }
    Cette fois avant de parler, j'ai testé le code sur mon PC : je ne sais pas si c'est optimisé, mais en tout cas ça fonctionne

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

Discussions similaires

  1. Problème avec un set dans un if dans une boucle
    Par keks06 dans le forum Scripts/Batch
    Réponses: 4
    Dernier message: 20/05/2008, 09h26
  2. [debutant][Gregoriancalendar] Problème avec le set
    Par britou dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 30/06/2004, 16h01
  3. Recherche "étoilée" avec std::set
    Par guejo dans le forum MFC
    Réponses: 2
    Dernier message: 06/05/2004, 13h28
  4. Boucle avec variable à incrémenter
    Par snoop dans le forum Linux
    Réponses: 2
    Dernier message: 19/03/2004, 11h07
  5. boucle avec condition d'arret changeante
    Par NicoH dans le forum Langage
    Réponses: 3
    Dernier message: 10/06/2003, 11h48

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