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++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  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