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 :

Foncteur d'additionnement de std::pair


Sujet :

C++

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2011
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 1
    Points : 2
    Points
    2
    Par défaut Foncteur d'additionnement de std::pair
    Bonjour,

    Je suis actuellement en train de développer une classe qui analyse un flux entrant et compte le nombre d'occurrences pour chaque caractère, en stockant le résultat dans un std::map. Jusque là tout va bien, mais à la fin du programme je dois afficher le pourcentage d'occurrence pour chaque lettre, donc il me faut le nombre total de lettres qui ont été analysées, j'ai donc opté pour un foncteur :

    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
    template<class T1, class T2>
    class TotalPair
    {
    	T2 m_total;
     
    	public:
    		void operator()(std::pair<T1, T2> const &x)
    		{
    			// Add number of occurrences
    			m_total += x.second;
    		}
     
    		T2 total() const
    		{
    			// Return total number of occurrences
    			return m_total;
    		}
     
    		TotalPair() : m_total(0)
    		{
    		}
    };
    Si j'affiche m_total depuis l'intérieur de la classe, tout fonctionne comme prévue, mais dès que je l'affiche depuis l'extérieur de la classe avec la méthode accesseur il m'affiche la valeur avec laquelle a été initialisée m_total :

    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
    ostream &operator<<(ostream &out, FrequencyAnalysis const &freqAnalysis)
    {
    	// Check output stream
    	if (not out)
    		throw runtime_error("operator<<: bad out");
     
    	// Get the total number of occurrences
    	statsMap stats(freqAnalysis.stats());
    	TotalPair<char, int> total;
    	for_each(stats.begin(), stats.end(), total);
    	cout << total.total() << endl; // FIXME: AFFICHE 0
     
    	// Print number of occurrences for each character
    	PrintPair<char, int> print(out);
    	for_each(stats.begin(), stats.end(), print);
     
    	// Return output stream
    	return out;
    }
    Bref je ne vois vraiment pas d'où peut bien venir le problème, j'ai cherché pendant des heures, j'ai même essayé des exemples de code tout faits et censés fonctionner mais j'ai le même problème partout.

    Merci par avance de votre aide,
    Fr3ak.

    Edit : mea culpa, je n'avais pas assez cherché, il fallait récupérer le retour de la fonction std::for_each.

    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
    ostream &operator<<(ostream &out, FrequencyAnalysis const &freqAnalysis)
    {
    	// Check output stream
    	if (not out)
    		throw runtime_error("operator<<: bad out");
     
    	// Get the total number of occurrences
    	statsMap stats(freqAnalysis.stats());
    	TotalPair<char, int> total;
    	total = for_each(stats.begin(), stats.end(), total);
    	cout << total.total() << endl; // OK
     
    	// Print number of occurrences for each character
    	PrintPair<char, int> print(out);
    	for_each(stats.begin(), stats.end(), print);
     
    	// Return output stream
    	return out;
    }

  2. #2
    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,

    Si tu l'as résolu ( même tout seul ), alors il faut cocher le post comme

    Merci

  3. #3
    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
    Salut,
    Je serais parti sur un std::accumulate (avec un foncteur pour n'accumuler que sur le second) qui montre mieux l'objectif du parcours de la séquence :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    total = std::accumulate(stats.begin(), stats.end(),
       [](std::pair<char, int> const &x, int cumul) // lambda C++11 mais avec un foncteur c'est idem
       { return cumul + x.second;}
       ,0
    );
    ou un boost::transform_iterator carrément sur l'itérateur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    auto foncteur =  [](std::pair<char, int> const &x) 
       { return cumul + x.second;}
    total = std::accumulate(
       boost::make_transform_iterator(stats.begin(),foncteur)
       ,boost::make_transform_iterator(stats.end(),foncteur)
       ,0
    );

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

Discussions similaires

  1. std::pair et void*
    Par ta9ada dans le forum Langage
    Réponses: 4
    Dernier message: 23/12/2011, 06h51
  2. std::pair et reference
    Par camboui dans le forum SL & STL
    Réponses: 17
    Dernier message: 30/03/2009, 19h54
  3. Défénir un std::map à partir d'un std::pair
    Par mat087 dans le forum SL & STL
    Réponses: 3
    Dernier message: 30/12/2006, 19h36
  4. tri sur std::vector<std::pair<int, float> >
    Par b4u dans le forum SL & STL
    Réponses: 15
    Dernier message: 01/10/2006, 09h19
  5. Equivalent de std::pair mais pour trois valeurs
    Par Rodrigue dans le forum SL & STL
    Réponses: 6
    Dernier message: 26/09/2006, 22h00

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