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

Langage C++ Discussion :

Création d'histogramme a partir d'une structure map


Sujet :

Langage C++

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    etudiant
    Inscrit en
    Novembre 2014
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : etudiant
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2014
    Messages : 39
    Points : 31
    Points
    31
    Par défaut Création d'histogramme a partir d'une structure map
    Bonjour,

    En cherchant comment faire un histogramme en C++ je suis tombé sur ce bout de code (source)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    void histo_2 (int values[], int sz)
    {
      int level = max_arr(values,sz);   // std method to do this?
      for(; level > 0; level—) {      // leave out 1st part of for-loop
        for(int i = 0; i < sz; i++)
          if (values[i] >= level) cout << "**** ";
                             else cout << "     ";
        cout << endl;
    Ici c'est une liste qui est utilisée dans mon cas j'aimerais l'adapter à une map : J'ai une map comme tel : map<string, vector<string> > meds;

    De plus j'utilise un iterator (itmeds) pour parcourir la map, mais je n'arrive pas à 'comprendre' ce que max_arr() produit comme int (cf. int level = max_arr(values,sz). Et de plus comment mettre en liaison les deux.

    Cordialement,

    Unic0

  2. #2
    Membre chevronné

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2013
    Messages : 610
    Points : 1 878
    Points
    1 878
    Billets dans le blog
    21
    Par défaut
    max_arr renvoie l'int le plus élevé du tableau.

    L'idée de cet algorithme est de descendre de la valeur la plus élevée; à chaque pas, une ligne est dessinée, pleine à l'endroit où la valeur du tableau est au moins aussi élevée que level, vide ailleurs.

    Faire un histogramme avec une map<string, vector<string>> me paraît un peu étrange, quel est ton objectif en fait? Il faut que tes valeurs soient numériques pour avoir un histogramme, non?

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    etudiant
    Inscrit en
    Novembre 2014
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : etudiant
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2014
    Messages : 39
    Points : 31
    Points
    31
    Par défaut
    merci pour le max_arr().

    En ce qui concerne l'histogramme il s'agit de compter les occurence dans le vector et en faire un histogramme avec le nom de la clé a un endroit ou un autre.

    Est-ce que cela est possible ?

    Cordialement,

    Unic0

  4. #4
    Membre chevronné

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2013
    Messages : 610
    Points : 1 878
    Points
    1 878
    Billets dans le blog
    21
    Par défaut
    oui, vu sous cet angle

    Néanmoins la manipulation des maps via itérateur est un peu moche. L'itérateur pointe sur des paires (en l'occurrence pair<std::string, std::vector<std::string>>). Le mieux à mon avis est de convertir ta map en deux vecteurs, puis d'appliquer l'algorithme que tu proposes:

    Code C++ : 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
    int count_occ(std::vector<std::string>& v) {
      return std::count_if(v.begin(), v.end(), [&](const std::string& s) { return is_an_occ(s); }); // à toi de définir is_an_occ
    }
     
    void histo(std::map<std::string, std::vector<std::string>>& m) {
    	std::vector<std::string> labels;
    	std::vector<int> values;
    	for (auto& kv : m) {
    		labels.push_back(kv.first);
    		values.push_back(count_occ(kv.second));
    	}
    	int max_level = *std::max_element(values.begin(), values.end());
    	for (; max_level != 0; --max_level) {
    		for (int i : values) { std::cout << (i < max_level ? "   " : "***"); }
    		std::cout << std::endl;
    	}
    	for (auto& s : labels) std::cout << s.substr(0,2) << ' '; // les deux premiers caractères pour ne pas dépasser...
    }

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    etudiant
    Inscrit en
    Novembre 2014
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : etudiant
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2014
    Messages : 39
    Points : 31
    Points
    31
    Par défaut
    Du coup j'ai deux questions : La permière est comment on 'coupe' une map en deux ? et la seconde concerne ce a quoi fait référence is_an_occ(s). Je débute en C++ je pense qu'il y quelques notions qui m'échappent quand meme ^^


    Cordialement,

    Unic0

  6. #6
    Membre chevronné

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2013
    Messages : 610
    Points : 1 878
    Points
    1 878
    Billets dans le blog
    21
    Par défaut
    tu m'as dit que tu voulais compter les occurrences dans le vecteur. Je ne sais pas de quelles occurrences tu parles, alors j'ai juste choisi un nom arbitrairement, is_an_occ, pour une fonction qu'il te revient d'implémenter et qui teste si une string du vector est une occurrence ou pas.

    Couper une map en deux ça n'a pas énormément de sens... mais bon c'est possible, quelque chose comme:

    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    typedef std::map<std::string, std::vector<std::string>> SVSMap;
     
    splitInTwo (const SVSMap& src, SVSMap& firstHalf, SVSMap& secondHalf) {
      int pivot = src.size()  / 2, c = 0;
      for (auto& kv : src) {
        if (c++ < pivot) firstHalf[kv.first] = kv.second;
        else secondHalf[kv.first] = kv.second;
      }
    }

    Tu devrais prendre le temps d'explorer par toi même le langage et la librairie standard en revanche. Et réfléchir aux structures de données également, parce que je n'ai pas l'impression que tes choix soient très cohérents... mais je peux me tromper, bien évidemment.

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    etudiant
    Inscrit en
    Novembre 2014
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : etudiant
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2014
    Messages : 39
    Points : 31
    Points
    31
    Par défaut
    Malheureusement ce que tu dis est vrai, il faut (et je vais) que j'explore plus profondément la STL, néanmoins le travail que j'essaie de mener à bien est du pour demain (une opération chirurgical imprévue m'ayant limité pour effectuer le travail -_-') de fait j'essaye de faire avec les éléments que j'ai et 'le peu' que je connaisse.

    Je vais essayer de faire fonctionner ce que tu m'as donné. Merci beaucoup pour le temps que tu as pu consacrer et aux réponses que tu m'as apporté.

    Je vais essayer de faire au mieux.

    Cordialement,

    Merci encore,

    Unic0

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

Discussions similaires

  1. [A-03] Création d'un tableau à partir d'une requête
    Par helprojet dans le forum VBA Access
    Réponses: 3
    Dernier message: 16/02/2009, 12h41
  2. Création d'un arbre à partir d'une liste contigue
    Par karaz_karaz dans le forum C
    Réponses: 2
    Dernier message: 28/06/2008, 23h51
  3. Création d'un contact à partir d'une VCard
    Par myrddin772 dans le forum VBA Outlook
    Réponses: 8
    Dernier message: 28/05/2008, 15h38
  4. Création d'un vecteur à partir d'une structure
    Par lilyla dans le forum MATLAB
    Réponses: 4
    Dernier message: 13/02/2008, 13h45
  5. Réponses: 2
    Dernier message: 23/01/2008, 14h07

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