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

SL & STL C++ Discussion :

find avec un vector de pair


Sujet :

SL & STL C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 95
    Par défaut find avec un vector de pair
    Bonjour à tous,

    J'utilise une structure de donnée que je ne maitrise pas complètement. J'ai une variable label définie ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vector<pair<string, int>> label;
    Mon problème est pourtant assez simple, j'aimerai utiliser la fonction std::find mais faire la comparaison simplement sur le 'first', cad sur la string.

    Avez-vous une idée de comment limiter la comparaison au first de la pair ???

    Merci d'avance

  2. #2
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    Une solution à base de std::find_if pourquoi pas?
    http://www.sgi.com/tech/stl/find_if.html

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 95
    Par défaut
    J'ai essayé ça, mais ça compile même pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    string label = "1";
    vector<pair<string,int>>::iterator itfound ; // <label, count>
    itfound  = std::find_if(plab.begin(), plab.end(), std::bind1st( greater<string>(),label) );

  4. #4
    Membre très actif
    Profil pro
    professeur des universités à la retraite
    Inscrit en
    Août 2008
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : professeur des universités à la retraite

    Informations forums :
    Inscription : Août 2008
    Messages : 364
    Par défaut
    Une question peut-être inepte mais pourquoi ne pas avoir choisi plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    map<string, int> label;
    ?
    (ou éventuellement unordered map ou multimap)

  5. #5
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    J'aime pas trop donné des codes complet en général mais bon, ce soir j'avais envie ^^ :

    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
    23
    24
    25
     
    struct mypred
    {
        bool operator()(const std::pair<int, int>& p) const
        {
            return p.first == 2;
        }
    };
     
    int main(int argc, char *argv[])
    {
        typedef std::vector<std::pair<int, int> > bar;
        bar foo;
        foo.push_back(std::make_pair(1, 10));
        foo.push_back(std::make_pair(2, 9));
        foo.push_back(std::make_pair(3, 8));
        foo.push_back(std::make_pair(4, 7));
        foo.push_back(std::make_pair(5, 6));
     
        bar::const_iterator pos = std::find_if(foo.begin(), foo.end(), mypred());
     
        std::cout << pos->first << " " << pos->second;
     
        return 0;
    }
    @ptyxs : en général c'est pour des considérations de performances, y'a de réelle différence de perfs selon l'application entre un vector<pair<>> et une map. Récemment fchartron en a discuté sur le forum face à un cas réel il me semble.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 95
    Par défaut
    Citation Envoyé par Goten Voir le message
    J'aime pas trop donné des codes complet en général mais bon, ce soir j'avais envie ^^ :

    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
    23
    24
    25
     
    struct mypred
    {
        bool operator()(const std::pair<int, int>& p) const
        {
            return p.first == 2;
        }
    };
     
    int main(int argc, char *argv[])
    {
        typedef std::vector<std::pair<int, int> > bar;
        bar foo;
        foo.push_back(std::make_pair(1, 10));
        foo.push_back(std::make_pair(2, 9));
        foo.push_back(std::make_pair(3, 8));
        foo.push_back(std::make_pair(4, 7));
        foo.push_back(std::make_pair(5, 6));
     
        bar::const_iterator pos = std::find_if(foo.begin(), foo.end(), mypred());
     
        std::cout << pos->first << " " << pos->second;
     
        return 0;
    }
    @ptyxs : en général c'est pour des considérations de performances, y'a de réelle différence de perfs selon l'application entre un vector<pair<>> et une map. Récemment fchartron en a discuté sur le forum face à un cas réel il me semble.
    Merci pour ce code, c'est quand même pas mal ce que je cherchais.

    Par contre, une chose me pose encore problème : dans le prédicat, first est comparé à 2. Pourquoi pas, mais comment passer une variable pour remplacer ce 2 ???

    Merci d'avance, encore...

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

Discussions similaires

  1. Problem avec std::vector
    Par boiteweb dans le forum SL & STL
    Réponses: 5
    Dernier message: 29/04/2006, 12h56
  2. Cast avec un vector
    Par backus dans le forum Langage
    Réponses: 9
    Dernier message: 11/04/2006, 13h10
  3. Problème avec std::Vector
    Par mister3957 dans le forum SL & STL
    Réponses: 8
    Dernier message: 16/02/2006, 10h18
  4. [struts][iterate] problème logic:iterate avec un Vector
    Par jaimepasteevy dans le forum Struts 1
    Réponses: 9
    Dernier message: 31/03/2004, 18h05
  5. [Struts] logic:iterate avec un Vector
    Par laurentb dans le forum Struts 1
    Réponses: 18
    Dernier message: 03/03/2004, 14h42

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