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

Boost C++ Discussion :

fold compter le nombre de float


Sujet :

Boost C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    688
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 688
    Par défaut fold compter le nombre de float
    tiré tout droit de la doc de boost :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    typedef vector<long,float,short,double,float,long,long double> types;
    typedef fold<
          types
        , int_<0>
        , if_< is_float<_2>,next<_1>,_1 >
        >::type number_of_floats;
    j'ai du mal à comprendre la logique , pourquoi est ce que l'on test le deuxième élément de la liste, pour savoir si il faut prendre next ou _1? ici _1 est le chiffre _1 ou le placeholder ?

  2. #2
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    Parce que t'as pas la sémantique de fold regarde :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    fold(Seq, Prev, BinaryOp) :=
         if Seq is empty then:
               Prev
         else:
               fold(tail(Seq),
                     BinaryOp(Prev, head(Seq)),
                     BinaryOp)
    Avec ça tu dois pouvoir trouver à quoi "font référence" _2 et _1 ...

    Ah et un petit indice, mpl::next a plusieurs "surcharges", ça marche aussi avec les integral constants... (et ça a la sémantique d'une incrémentation)

  3. #3
    Membre Expert
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Par défaut
    _2 represente l'element courant de l'iteration du fold, _1 represente l'etat courant.

    donc le fold dis Pour chaque element dans la meta-sequence, si l'element courant ets un float j'increment l'etat sinon je le laisse tel quel

  4. #4
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    Fallait pas spoil comme ça Joel, j'avais volontairement omis la solution toute faite :p

  5. #5
    Membre très actif
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    688
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 688
    Par défaut
    Merci !

  6. #6
    Membre Expert
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Par défaut
    Citation Envoyé par Goten Voir le message
    Fallait pas spoil comme ça Joel, j'avais volontairement omis la solution toute faite :p
    c'est les fetes ca doit etre pour ca. Pour penitence j ene repondrais pas a ca prochaine question :o

  7. #7
    Alp
    Alp est déconnecté
    Expert confirmé

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Une explication sur le fold en général... : http://www.haskell.org/haskellwiki/Fold

  8. #8
    Membre très actif
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    688
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 688
    Par défaut
    Citation Envoyé par Joel F Voir le message
    _2 represente l'element courant de l'iteration du fold, _1 represente l'etat courant.

    donc le fold dis Pour chaque element dans la meta-sequence, si l'element courant ets un float j'increment l'etat sinon je le laisse tel quel
    - Comment est ce que l'algo arrive à savoir que le premier placeholder (_2) réfère à l'élément courant et que _1 représente l'état courant ?

    - Pourquoi est ce is_float<_2> et non is_float<_1> ?

    - Qu'est ce qui se passe concrètement si on next ou si on "reste dans l'état courant" ?

  9. #9
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    Citation Envoyé par guillaume07 Voir le message
    - Comment est ce que l'algo arrive à savoir que le premier placeholder (_2) réfère à l'élément courant et que _1 représente l'état courant ?
    C'est fold qui dicte ça justement donc il le sait parce ... c'est fait comme ça :'.

    Citation Envoyé par guillaume07 Voir le message
    - Pourquoi est ce is_float<_2> et non is_float<_1> ?
    Bah parce que ton test tu le fais sur l'élément courant pas sur un état. Ce que tu veux tester c'est chaque élément du vector!

    - Qu'est ce qui se passe concrètement si on next ou si on "reste dans l'état courant" ?
    hum? bah si tu "next" ça fait incrémente l'integral constant. Et si tu "restes dans l'état courant" bah y'a pas d'incrémentation c'est tout.

  10. #10
    Membre très actif
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    688
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 688
    Par défaut
    "Bah parce que ton test tu le fais sur l'élément courant pas sur un état"

    ok donc next<_1> = next de l'état courant =

    - +1 sur l'integral constante
    - fait pointer _2 sur le prochain élément de la séquence

    ?

    Autrement pour info , le piège pour quelqu'un qui découvre cet algo , c'est de penser que is_float<_2> pointe sur le 2eme élément du vecteur, et que _1 sur le premier élément...

Discussions similaires

  1. Comment compter le nombre de lettre identique ?
    Par divableue dans le forum ASP
    Réponses: 3
    Dernier message: 07/11/2003, 15h01
  2. Compter le nombre de page d'un report
    Par ToYonos dans le forum C++Builder
    Réponses: 4
    Dernier message: 17/06/2003, 09h36
  3. compter le nombre de record
    Par pram dans le forum XMLRAD
    Réponses: 2
    Dernier message: 12/03/2003, 09h53
  4. [TListView] Compter le nombre de lignes
    Par agh dans le forum Composants VCL
    Réponses: 2
    Dernier message: 30/09/2002, 20h25
  5. Compter le nombre ligne listée (COUNT) ?
    Par StouffR dans le forum Langage SQL
    Réponses: 7
    Dernier message: 02/09/2002, 09h41

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