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

SL & STL C++ Discussion :

Recursion de std::accumulate.


Sujet :

SL & STL C++

  1. #1
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut Recursion de std::accumulate.
    Bonjour,
    J'ai un ensemble de classes où chacune contient une liste de la classe suivante. J'aimerais à partir du sommet obtenir le total des éléments. Un peu de code pour mieux comprendre:
    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
     
    class A
    {
    public:
       std::vector<int> m_vectElts;
    };
     
    class B
    {
    public:
       std::vector<A> m_vectA;
    };
     
    class C
    {
    public:
       std::vector<B> m_vectB;
    };
    Partant d'un objet C, j'aimerais savoir combien de int j'ai au total.
    Aujourd'hui j'arrive à faire ça:
    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
    40
    41
    42
    43
    44
    45
    46
    47
     
    class A
    {
    public:
       std::vector<int> m_vectElts;
     
       int NbrElts()
       {
          return m_vectElts.size();
       }
    };
     
    class B
    {
    public:
       std::vector<A> m_vectA;
     
       int NbrElts()
       {
           return std::accumulate
           (
               boost::make_transform_iterator(m_vectA.begin(),std::mem_fun_ref(&A::NbrElts)),
               boost::make_transform_iterator(m_vectA.end(),std::mem_fun_ref(&A::NbrElts)),
               0
           );
       }
    };
     
    class C
    {
    public:
       std::vector<B> m_vectB;
     
       int NbrElts()
       {
           return std::accumulate
           (
               boost::make_transform_iterator(m_vectB.begin(),std::mem_fun_ref(&B::NbrElts)),
               boost::make_transform_iterator(m_vectB.end(),std::mem_fun_ref(&B::NbrElts)),
               0
           );
       }
     
    };
     
    Puis les éléments:
    std::cout<<c.NbrElts();
    Mais, trimbaler un NbrElts tout le long de la chaîne ne me plaît pas trop. Je n'arrive pas à faire cette récursion avec boost. Je n'arrive pas à sortir quelque chose du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    std::accumulate
    (
      boost::make_transform_iterator(
       MonC.m_vectB.begin(),std::accumulate(???)),
      boost::make_transform_iterator(
       MonC.m_vectB.end(),std::accumulate(???)),
      0
    );
    Quelqu'un aurait-il une idée?

  2. #2
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    accumulate effectue l'addition de chaque élément. Si j'ai bien compris, toi tu souhaites juste compter le nombre d'éléments. Dans ce cas, une simple boucle suffit. Un truc dans le style:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    C c;
    std::vector<B>::const_iterator it1 = c.m_vectB.begin();
    size_t sum = 0;
    for ( ; it1 != c.m_vectB.end(); ++it1 ) {
    	std::vector<B>::const_iterator it2 = (*it).m_vectA.begin();
    	for ( ; it2 != (*it).m_vectA.end(); ++it2 ) {
    		sum += (*it2).m_vectElts.size();
    	}
    }
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  3. #3
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Salut

    tu pourrais aussi faire un truc comme cela
    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    #include <iostream>
    #include <vector>
    #include <algorithm>
    #include <numeric>
     
    struct A
    {
       std::vector<int> m_vectElts;
    };
     
    struct B
    {
       std::vector<A> m_vectA;
    };
     
    struct C
    {
       std::vector<B> m_vectB; 
    };
     
    template <typename T>
    struct count
    {
        int operator() (int i,const  T &t)
        {
            return 0;
        }
    };
    template <>
    int count<A>::operator() (int i,const  A &a)
    {
        return i+a.m_vectElts.size();
    }
    template <>
    int count<B>::operator() (int i,const  B &b)
    {
        return i+std::accumulate(b.m_vectA.begin(),b.m_vectA.end(),0,count<A>());
    }
     
     
    int main(int argc, char* argv[])
    {
        A a;
        B b;
        C c;
        a.m_vectElts.resize(10);
        b.m_vectA.push_back(a);
        b.m_vectA.push_back(a);
        b.m_vectA.push_back(a);
     
        c.m_vectB.push_back(b);
        c.m_vectB.push_back(b);
        c.m_vectB.push_back(b);
     
        std::cout<<std::accumulate(c.m_vectB.begin(),c.m_vectB.end(),0,count<B>());
    	return 0;
    }

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Merci pour les réponses.
    La nuit portant conseil, j'ai bien pensé me servir de classes template tierces pour m'assurer du comptage. Donc quelque chose comme ce que suggère MonGaulois. Au boulot donc pour mettre en application...

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

Discussions similaires

  1. [COMPILATION][RECURSIVE] outil ?
    Par narmataru dans le forum Build
    Réponses: 6
    Dernier message: 14/01/2009, 15h05
  2. Sauvegarde std::vector dans un .ini
    Par mick74 dans le forum MFC
    Réponses: 2
    Dernier message: 12/05/2004, 13h30
  3. Recherche "étoilée" avec std::set
    Par guejo dans le forum MFC
    Réponses: 2
    Dernier message: 06/05/2004, 13h28
  4. std MFC
    Par philippe V dans le forum MFC
    Réponses: 7
    Dernier message: 17/01/2004, 00h54
  5. STL : std::set problème avec insert ...
    Par Big K. dans le forum MFC
    Réponses: 13
    Dernier message: 08/11/2003, 01h02

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