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 :

Vecteurs : max_element et find


Sujet :

C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 31
    Points : 22
    Points
    22
    Par défaut Vecteurs : max_element et find
    Bonjour,

    Je dispose de 2 vecteurs qui sont :
    listeBiface : vecteur contenant des objets de types "bifaces" (je vous épargne la structure)
    tabCompteur : vecteur d'entier avec un nombre d'occurence associé à chacune des précédentes bifaces, de telle sorte que tabCompteur[i] dénombre le nombre d'occurences de la biface située dans listeBiface[i].

    Malheureusement on m'impose de conserver ces 2 structures distinctes même si elles sont fortement corrélées ! (j'aurais préféré ajouter un compteur dans la structure des bifaces).

    Mon objectif est de récupérer l'objet biface qui est le plus fréquent.
    Pour cela mon idée est de récupérer dans un premier temps la valeur de l'élément le plus fréquent (via tabCompteur), puis de stocker dans une variable "posMax" le premier indice dans ce vecteur ou je trouve cette valeur (il ne m'importe pas qu'il puisse y avoir un doublon ayant la même valeur).
    Après quoi je retourne le "posMax" ième élément de ma liste de biface qui devrait logiquement être ma biface la plus fréquente.

    Or cela ne marche pas (comme on pouvait s'y attendre ).

    Voici ce que j'ai essayé :

    unsigned int valMax = max_element(tabCompteur.begin(), tabCompteur.end()); //récupère la valeur la plus grande
    int posMax = find(tabCompteur.begin(), tabCompteur.end(), valMax); // récupère l'indice de la valeur la plus grande

    return listeBifaces[posMax];
    J'obtiens l'erreur suivante :

    erreur: cannot convert ‘__gnu_cxx::__normal_iterator<int*, std::vector<int> >’ to ‘unsigned int’ in initialization
    J'ai évidement essayé de remplacer le type de valMax par un "iterator" ou un pointeur sur cet itérateur, sans succès.

    Je me dit que je dois être entrain de chercher à réinventer la roue, et qu'il doit bien exister une méthode moins prise de tête que ce que je tente actuellement...

    Quelqu'un peut-il m'aider ?

    Merci d'avance !

  2. #2
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2010
    Messages : 517
    Points : 718
    Points
    718
    Par défaut
    Salut,

    D'après la doc, max_element() retourne un iterator.

    As-tu essayé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    //Je suppose que tabCompteur est de type std::vector<unsigned int>
    std::vector<unsigned int>::iterator valMaxIt = max_element(tabCompteur.begin(), tabCompteur.end());
    ?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 31
    Points : 22
    Points
    22
    Par défaut
    Merci pour cette réponse. tabCompteur était déclaré en tant que std::vector<int> je ne l'avais pas précisé, mais du coup ta réponse résoud mon problème sur la première ligne de code.

    Cependant, j'ai un itérateur sur mon vecteur... mais j'avoue ne pas savoir quoi en faire...

    je n'arrive pas à faire quelque chose comme :
    return listeBiface[valMaxIt];

    et qui me renverrai la biface la plus fréquente.

    Si quelqu'un a un complément d'aide, je suis prenneur...

  4. #4
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Bonjour,
    As-tu envisagé d'avoir une collection de paires?
    typiquement un std::vector< std::pair<BiFace*, int> >?

    L'avantage, c'est que tu ne modifie pas le biface, mais tu peux coller directement les informations, et l'itérateur est déjà valide (il suffit de donner un comparateur à max-elements)
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  5. #5
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2010
    Messages : 517
    Points : 718
    Points
    718
    Par défaut
    Je te recommande de lire la FAQ sur les itérateurs.

    Pour résoudre ton problème fait juste:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return listeBiface[*valMaxIt];

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 31
    Points : 22
    Points
    22
    Par défaut
    Merci, j'ai toujours eu un peu de mal (pour ne pas dire beaucoup) avec les itérateurs.
    Ta solution marche, et je vais me consacrer un peu à la relecture de la section concernée pour éviter de futures questions là dessus.

  7. #7
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    vois les itérateurs comme un pointeur sur les membres d'une collection.

    imagine un peu le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int tab[]={1,2,3,4,5,6,7,8,9,10};
     
    for(int* it=&tab[0]; it!=&tab[10];++it) {
        std::cout<<(*it)<<std::endl;
    }
    Comme tu le vois, c'est la déclaration d'un tableau normal, suivi du parcours de via un pointeur.

    Maintenant, la meme chose avec un vector.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    //(type d'initialisation valable en C++11
    std::vector<int> tab={1,2,3,4,5,6,7,8,9,10};
     
    for(std::vector<int>::iterator it=tab.begin(); it!=tab.end();++it) {
        std::cout<<(*it)<<std::endl;
    }
    Pour le concept, je t'invite à écrire une classe intarray, et un iterateur dessus.

    intarray est initialisé avec un tableau et sa taille, qui sont strictement privés.
    intarray propose les fonctions iterator begin(), iterator end().
    iterator est une classe, amie ou membre publique de intarray.
    iterator propose operator++() et operator*().
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  8. #8
    Membre éclairé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2007
    Messages
    373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Royaume-Uni

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 373
    Points : 764
    Points
    764
    Par défaut
    Citation Envoyé par darkman19320 Voir le message
    Pour résoudre ton problème fait juste:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return listeBiface[*valMaxIt];
    Attention ! *valMaxIt est la plus grande valeur, et non pas la position de la plus grande valeur dans le tableau.

    Si je ne m'abuse, il faut écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return listBiface[valMaxIt - tabCompteur.begin()];

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

Discussions similaires

  1. std find sur un vecteur
    Par DakM dans le forum SL & STL
    Réponses: 8
    Dernier message: 13/03/2013, 11h28
  2. Vecteur : find(min(A))
    Par Youni92 dans le forum MATLAB
    Réponses: 2
    Dernier message: 07/09/2010, 11h46
  3. Find vecteur / matrice
    Par farfouch00 dans le forum MATLAB
    Réponses: 4
    Dernier message: 01/06/2010, 11h54
  4. Réponses: 24
    Dernier message: 19/03/2009, 16h18
  5. matrices * vecteur
    Par delire8 dans le forum Algorithmes et structures de données
    Réponses: 15
    Dernier message: 07/09/2002, 14h15

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