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

Langage C++ Discussion :

le sens de foreach


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Avril 2008
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 187
    Par défaut le sens de foreach
    Bonjour tous le monde

    je veux savoir le sens de foreach ?!!
    es-ce qu'il est un constructeur ou equivalent de la boucle for ?!! ou autre chose ?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    #include <stdlib.h>
     
    void CBXConfig::addSources(QStringList list)
    {
        foreach(QString s, list) {
            if (!m_sources.contains(s))
                m_sources += s;
        }
    }
    Cordialement

  2. #2
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    507
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mai 2006
    Messages : 507
    Par défaut
    Bonjour,

    Il ne s'agit pas d'un mot clé c++ mais d'un ajout de Qt... (http://qt.developpez.com/doc/latest/...s.html#foreach)

    Cela permet d'itérer sur ta liste... et c'est effectivement, proche du comportement de 'for' dans ce cas là...

  3. #3
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Citation Envoyé par mima_mine Voir le message
    Bonjour tous le monde

    je veux savoir le sens de foreach ?!!
    es-ce qu'il est un constructeur ou équivalent de la boucle for ?!! ou autre chose ?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    #include <stdlib.h>
     
    void CBXConfig::addSources(QStringList list)
    {
        foreach(QString s, list) {
            if (!m_sources.contains(s))
                m_sources += s;
        }
    }
    Cordialement
    A ma connaissance, C++ ne possède pas de mot-clef foreach. C++0x possède bien une boucle for dont la syntaxe est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (TYPE var : variable_iterable) expr;
    qui exécute expr sur chaque valeur de variable_iterable. Exemple:

    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
     
    #include <iostream>
     
    void f()
    {
      int array[] = { 1, 2, 3, 4, 5 };
      for (int& x : array)
      {
        std::cout << "x = " << s << std::endl;
        x *= 2;
      }
      for (int x : array)
      {
        std::cout << "x' = " << x << std::endl;
      }
    }
    // sortie:
    // x = 1
    // x = 2
    // x = 3
    // x = 4
    // x = 5
    // x' = 2
    // x' = 4
    // x' = 6
    // x' = 8
    // x' = 10
    Bien sûr, ça marche aussi si variable_iterable est un std::vector<> ou un autre conteneur de la librairie standard. Cf C++0x : range-based for.

    Il y a aussi une fonction template for_each<> dans <algorithm> - depuis la standardisation de 1998 cette fois. On ne parle plus de C++0x.

    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
     
    #include <iostream>
    #include <algorithm>
     
    struct operation
    {
      void operator()(int x) { std::cout << "x = " << x << std::endl; }
    };
     
    void f()
    {
      int a[5] = { 1, 2, 3, 4, 5 }
      std::vector<int> v(a, a+5);
     
      std::for_each(v.begin(), v.end(), operation());
    }
    J'ai cru comprendre que C++0x va améliorer cette fonction - des surcharges supplémentaires ont été proposées. L'une d'entre elle permet d'itérer sur un conteneur complet avec une fonction lambda (attention, ça pique un peu les yeux...):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #include <iostream>
    #include <algorithm>
     
    void f()
    {
      int a[5] = { 1, 2, 3, 4, 5 }
      std::vector<int> v(a, a+5);
     
      std::for_each(v, [](int x) { std::cout << "x = " << x << std::endl; });
    }
    C'est plus simple à écrire, mais c'est encore loin du range-based for.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5
    Par défaut
    En fait pour pouvoir benéficier de cette écriture avec une déclaration de variable dans l'appel de la "fonction" c'est qu'il s'agit d'une macro et non d'une vrai commande.

    Le for_each existe dans boost :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #define BOOST_FOREACH(VAR, COL)                                                                                   \
        BOOST_FOREACH_PREAMBLE()                                                                                      \
        if (boost::foreach_detail_::auto_any_t BOOST_FOREACH_ID(_foreach_col) = BOOST_FOREACH_CONTAIN(COL)) {} else   \
        if (boost::foreach_detail_::auto_any_t BOOST_FOREACH_ID(_foreach_cur) = BOOST_FOREACH_BEGIN(COL)) {} else     \
        if (boost::foreach_detail_::auto_any_t BOOST_FOREACH_ID(_foreach_end) = BOOST_FOREACH_END(COL)) {} else       \
        for (bool BOOST_FOREACH_ID(_foreach_continue) = true;                                                         \
                  BOOST_FOREACH_ID(_foreach_continue) && !BOOST_FOREACH_DONE(COL);                                    \
                  BOOST_FOREACH_ID(_foreach_continue) ? BOOST_FOREACH_NEXT(COL) : (void)0)                            \
            if  (boost::foreach_detail_::set_false(BOOST_FOREACH_ID(_foreach_continue))) {} else                      \
            for (VAR = BOOST_FOREACH_DEREF(COL); !BOOST_FOREACH_ID(_foreach_continue); BOOST_FOREACH_ID(_foreach_continue) = true)
    Le code fait assez mal aux yeux mais l'idée c'est que ça execute une boucle for classique pour toute collection définissant les méthodes necessaire pour un parcours séquentiel, ça marche aussi sur les tableaux contigues.

  5. #5
    Membre très actif 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
    Par défaut
    for_each existe aussi dans la stl pour parcourir les containers de la stl, vector, list, map ... (etc)
    la version de boost doit permettre de parcourir des containers spécifique a boost et la version que tu nous montre doit être une version qui permet d'itérer à travers des containers Qt.

Discussions similaires

  1. [ALGO] dessiner un triangle dans le bon sens
    Par lefait dans le forum Algorithmes et structures de données
    Réponses: 13
    Dernier message: 05/02/2005, 14h38
  2. Association : comment choisir le sens ?
    Par 1cado dans le forum Diagrammes de Classes
    Réponses: 2
    Dernier message: 26/09/2004, 23h12
  3. probleme réseau : ping a sens unique
    Par be_on_edge dans le forum Développement
    Réponses: 14
    Dernier message: 18/09/2004, 10h01
  4. sens trigomometrique
    Par CookSlash dans le forum OpenGL
    Réponses: 4
    Dernier message: 09/04/2004, 18h11

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