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 :

algorithm et map


Sujet :

C++

  1. #1
    Membre confirmé
    Inscrit en
    Septembre 2006
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 63
    Par défaut algorithm et map
    j arrive pas a appliquer l algorithm find de la bibliotheque standard sur une map que j ai crée

    par exemple :

    typedef map<int,string> mymap;
    mymap m;
    int keyval=0;
    mymap::iterator i = m.begin();
    mymap::iterator j = m.end();

    return find(i,j,mymap::value_type(1,"un"));

    tout ca dans une fonction qui a comme type de retour mymap::iterator

    mais ca me renvoi les erreurs

    In member function `std::_Rb_tree_iterator<std::pair<const int, std::string> > simulmap::find(const int&)':

    no matching function for call to `simulmap::find(std::_Rb_tree_iterator<std::pair<const int, std::string> >&, std::_Rb_tree_iterator<std::pair<const int, std::string> >&, std::pair<const int, std::string>)'

    candidates are: std::_Rb_tree_iterator<std::pair<const int, std::string> > simulmap::find(const int&)

    std::_Rb_tree_const_iterator<std::pair<const int, std::string> > simulmap::find(const int&) const

    pouvez vous m aider car je suis coincé

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    std::map::find ne prend qu'une clé en paramètre. Là on dirait que tu utilises std::find (ce qui n'a pas d'intérêt sur un std::map).

    Ceci fonctionnera mieux :

  3. #3
    Membre émérite Avatar de mchk0123
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    816
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 816
    Par défaut
    Je comprend pas pourquoi un simple :

    Ne te suffit pas ?

  4. #4
    Membre confirmé
    Inscrit en
    Septembre 2006
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 63
    Par défaut
    ca y est j ai trouvé

    map<int,string>::iterator result =
    find(m.begin(), m.end(),map<int,string>::value_type(1,"a"));

    ca marche tres bien

  5. #5
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Citation Envoyé par mchk0123
    Je comprend pas pourquoi un simple :

    Ne te suffit pas ?
    Vraisemblablement parce que ça crée une entrée si elle n'existe pas ?

    Sinon il vaut toujours mieux utiliser les méthodes plutôt que les algorithmes externes pour différentes raisons (dont la performance mais aussi tout ce qui découle du fait que équivalence et égalité sont deux notions différentes et les conteneurs associatifs travaillent avec l'équivalence alors que les algorithmes se basent sur l'égalité).

    MAT.

  6. #6
    Membre émérite Avatar de mchk0123
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    816
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 816
    Par défaut
    Citation Envoyé par Mat007
    Vraisemblablement parce que ça crée une entrée si elle n'existe pas ?
    Oui, ça fait vraiment trop longtemps que je ne pratique plus la STL

    Citation Envoyé par Mat007
    Sinon il vaut toujours mieux utiliser les méthodes plutôt que les algorithmes externes pour différentes raisons (dont la performance mais aussi tout ce qui découle du fait que équivalence et égalité sont deux notions différentes et les conteneurs associatifs travaillent avec l'équivalence alors que les algorithmes se basent sur l'égalité).
    Sans parler du fait que pour find() sur une map, on à, théoriquement parlant, besoin uniquement que de la clef "1" et pas de la valeur "a".

  7. #7
    Membre confirmé
    Inscrit en
    Septembre 2006
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 63
    Par défaut
    mais c est pas le find de map (map::find) mais c est le find de stl::algorithm
    qui est defini par
    template <class InputIterator, class T>
    InputIterator find ( InputIterator first, InputIterator last, const T& value );

    c ca le probleme !!!

  8. #8
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Citation Envoyé par ocean24
    c ca le probleme !!!
    Tout à fait !
    Mais justement on te suggérait d'utiliser std::map::find plutôt que std::find.

    Une raison particulière qui fasse que tu tiennes à utiliser std::find ?

    MAT.

  9. #9
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Au pire si tu veux que la clé ET l'élément correspondent, tu peux faire ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    map<int, string>::iterator It = m.find(1);
    if (It != m.end() && It->second == "a")
    {
        // Ok
    }
    else
    {
        // Pas trouvé
    }

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

Discussions similaires

  1. [SFML 2.0] Algorithme de map
    Par MotorX dans le forum SFML
    Réponses: 2
    Dernier message: 13/08/2013, 20h03
  2. Réponses: 7
    Dernier message: 19/02/2010, 09h42
  3. Réponses: 12
    Dernier message: 11/11/2007, 16h04
  4. map et algorithm copy
    Par ocean24 dans le forum SL & STL
    Réponses: 6
    Dernier message: 02/05/2007, 13h43
  5. aide : recherche algorithme mapping
    Par nagty dans le forum XML/XSL et SOAP
    Réponses: 4
    Dernier message: 30/12/2005, 14h19

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