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