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 :

Binary_search


Sujet :

C++

  1. #1
    Membre averti
    Inscrit en
    Avril 2005
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 42
    Par défaut Binary_search
    Bonjour, je me pose une question sur binary_search, en effet elle ne liste pas tous les elements de mon vector afin de les comparer, jugez par ce code :

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    #include <iostream>
    #include <algorithm>
    #include <vector>
     
    using namespace std;
     
     
    class CFriend
    {
      public:
     
      int _x;
     
      bool operator<(const CFriend& c) const
      {
    	  cout << "Value :  " << _x << " | " << c._x << endl;
    	return false;
      }
    };
     
    bool compare(const CFriend &ref1, const CFriend &ref2)
    {
    	cout << "Value : " << ref1._x << " | " << ref2._x << endl;
    	return false;
    }
     
    int main()
    {
            CFriend *c1 = new CFriend();
    	CFriend *c2 = new CFriend();
    	CFriend *c3 = new CFriend();
     
            c1->_x = 69;
    	c2->_x = 13;
    	c3->_x = 45;
     
    	CFriend *search = new CFriend();
    	search->_x = 69;
     
           vector<CFriend> vc;
    	vc.push_back(*c1);
    	vc.push_back(*c2);
    	vc.push_back(*c3);
     
    	if(binary_search(vc.begin(), vc.end(), *search)) cout << "Found !\n";
    	// 	if(binary_search(vc.begin(), vc.end(), *search, compare)) cout << "Found !\n";
    	else cout << "Not found !\n";
     
    	return 0;
    }
    Qui me retourne :
    Value : 13 | 69
    Value : 69 | 69
    Value : 69 | 69
    Donc il manque un objet dans la liste, celui avec _x == 45...
    Pourquoi ?

    Une autre question : pourquoi devoir redéfinir operator< et pas operator== ?

    Merci pour vos réponses.

  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
    binary_search effectue une recherche dichotomique, donc cela suppose que ton vecteur est trié... C'est pour cela que tous les éléments ne sont pas inspectés.

    De plus, renvoyer systèmatiquement false ne va pas l'aider à avoir un comportement normal

    Une autre question : pourquoi devoir redéfinir operator< et pas operator== ?
    Parce que l'algorithme effectue des tests d'équivalence, pas d'égalité. Et à partir de < on peut déduire les 5 autres opérateurs de comparaison.

  3. #3
    Membre averti
    Inscrit en
    Avril 2005
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 42
    Par défaut
    OK merci, mais dans operator< je peut faire une comparaison d'égalité == ou faut-il faire autre chose ? Du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    bool operator<()
    {
       if(_x == c._x) return false;
    }
    Dernière question : pour trier le vecteur (avec sort() ), je peux utiliser un foncteur ou une fonction, mais comment comparer exactement (quelles valeurs retourner) ?

    Merci beaucouP.

  4. #4
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    ??? Comment penses-tu ordonner avec une relation d'égalité ?

    Mais que cherches-tu à faire ? Tu as lu la FAQ ?
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  5. #5
    Membre averti
    Inscrit en
    Avril 2005
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 42
    Par défaut
    Excusez-moi, je me suis mal expliqué...
    Mais ca va, problème réglé . Merci

    Parce que l'algorithme effectue des tests d'équivalence, pas d'égalité. Et à partir de < on peut déduire les 5 autres opérateurs de comparaison.
    Justement, si je définis operator< pour les objets de ma classe, le compilo devrait automatiquement déduire des operator> et les autres qui suivent, nan ?

  6. #6
    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
    Justement, si je définis operator< pour les objets de ma classe, le compilo devrait automatiquement déduire des operator> et les autres qui suivent, nan ?
    C'est ce que j'ai dit non ? Enfin ce n'est pas le compilo qui les déduit, mais le programmeur s'il le souhaite. Mais de toute façon je ne suis pas certain que les algorithmes de tri ou de recherche de la STL aient besoin d'autre chose que de <.

  7. #7
    Membre averti
    Inscrit en
    Avril 2005
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 42
    Par défaut
    Ok, mais il se pourrait que dans une classe j'ai besoin de 2 operator< nan ?
    Par exemple si j'en place un pour effectuer les recherches avec binary_search et un autre pour pouvoir utiliser less<CFriend>, je fais comment ?

  8. #8
    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
    C'est pour cela qu'on a inventé les foncteurs.

  9. #9
    Membre averti
    Inscrit en
    Avril 2005
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 42
    Par défaut
    Bon ok...
    Dernière petite question, et apres j'arrete de vous harceler, promis ! :p

    Auriez-vous un lien qui développe un peu sur les différents types d'itérateur ; unidirectionnel, bidirectionnel, ramdom access etc... parce que j'ai pas bien saisi.

    Merci.

  10. #10
    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
    http://www.sgi.com/tech/stl/Iterators.html

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