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 :

Créer une "map" de comptage à partir d'une "list"


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 14
    Par défaut Créer une "map" de comptage à partir d'une "list"
    Bonjour,

    Je ne suis pas sûr d'écrire au bon endroit. Veuillez m'excuser dans le cas contraire. Voilà, mon problème.

    Je dispose d'une list de strings (une liste de prénoms) et je voudrais créer une map qui associe à un prénom de la liste son nombre d’occurrence dans cette liste. Y-a-t-il un moyen de faire cela simplement à l'aide de la STL (sans faire des boucles dans tous les sens) ?

    Merci d'avance !

  2. #2
    Membre Expert Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Par défaut
    Bonjour

    En gros tu parcours ta liste et augmente ton entier dans la map.

    Version boucle C++11 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (auto const & e : list) { ++map[e]; }
    Version algo avec lambda C++11 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for_each(list.begin(), list.end(), [&map](std::string const & e) { ++map[e]; });
    Version algo avec lambda C++14 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for_each(list.begin(), list.end(), [&map](auto const & e) { ++map[e]; });

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 14
    Par défaut
    C'est effectivement une formule avec un algorithme que je cherchais. Mais étant novice en C++, je ne savais pas comment parcourir la liste. Donc dans l'exemple donné, l'élément générique de la liste parcourue de list.begin() à list.end() est défini comme étant e ? Je ne savais pas qu'on pouvait lui donner un nom ! Juste une chose encore que je ne savais pas. Lorsque map[e] n'existe pas dans la map, la commande ++map[e] crée map[e] et y met la valeur "1" ? Tout se passe donc comme si par défaut map[e] valait 0 même si map[e] n'est pas défini ? On n'a pas besoin de faire un find ?

    Merci pour ton message.

  4. #4
    Membre Expert Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Par défaut
    Citation Envoyé par durn1818 Voir le message
    je ne savais pas comment parcourir la liste.
    Comme c'est une liste, avec des itérateurs (comme tous les conteneurs de la bibliothèque standard (et même plus)).

    Citation Envoyé par durn1818 Voir le message
    Donc dans l'exemple donné, l'élément générique de la liste parcourue de list.begin() à list.end() est défini comme étant e ?
    Oui. Dans mon premier exemple, il s'agit de la boucle « range-based for loop » introduit en C++11. On peut lire le code de cette façon : pour tous les éléments de list que je nomme e faire ...
    auto est l'inférence de type automatique et const & est pour avoir une référence sur type constant.
    Dans les autres exemples, j'utilise un algo de la bibliothèque standard for_each avec une lambda introduite en C++11 (et avec une lambda générique introduite en C++14). Une lambda est une fonction "anonyme", sa syntaxe est la suivante : [liste de capture](arguments) -> type de retour { corps de la fonction }. Pour plus d'infos : http://en.cppreference.com/w/cpp/language/lambda

    Citation Envoyé par durn1818 Voir le message
    Lorsque map[e] n'existe pas dans la map, la commande ++map[e] crée map[e] et y met la valeur "1" ? Tout se passe donc comme si par défaut map[e] valait 0 même si map[e] n'est pas défini ? On n'a pas besoin de faire un find ?
    Oui, map[i] créé l'élément s'il n'existe pas et l'initialise avec mapped_type() (dans ton cas int() qui vaut 0). Si on ne veut pas ce comportement on test avant ou on utilise map.at(i) qui envoie une exception si l'élément n'existe pas.
    Une fois ton map[i], tu l'incrémentes avec ++.
    Pas besoin de find puisque std::map est un conteneur trié qui s'en charge pour toi.
    Pour plus d'informations : http://www.cplusplus.com/reference/map/map/

    Citation Envoyé par durn1818 Voir le message
    Merci pour ton message.
    De rien

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 14
    Par défaut
    Tes explications remarquables. Tu devrais faire prof ! Merci beaucoup !

Discussions similaires

  1. Réponses: 4
    Dernier message: 15/01/2014, 20h29
  2. Nuage de points à partir d'une depth map
    Par on2101 dans le forum Traitement d'images
    Réponses: 3
    Dernier message: 21/12/2011, 18h27
  3. Changer le background d'un div à partir d'une image map.
    Par Daï2 dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 03/08/2009, 10h02
  4. Réponses: 1
    Dernier message: 26/03/2008, 22h19

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