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 :

Pourquoi utiliser std::less lorsque l'on réclame '<


Sujet :

SL & STL C++

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    162
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2002
    Messages : 162
    Points : 88
    Points
    88
    Par défaut Pourquoi utiliser std::less lorsque l'on réclame '<
    Bonjour,

    Je me demandais pourquoi les conteneurs demandant un ordre sur les données (comme les clés de std::map) ont un paramètre template de type std::less<T>.

    Vu que std::less<T> requiert que T soit comparable avec l'opérateur '<', pour quoi std::map n'utilise pas directement '<' plutôt que de passer par std::less ?

  2. #2
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 749
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 749
    Points : 10 666
    Points
    10 666
    Billets dans le blog
    3
    Par défaut
    Comment passer l'opérateur > en paramètre template ?
    Si ta question est pourquoi ce paramètre template, c'est less par défaut, mais tu peux en spécifier un autre et dans ce cas map ou autre n'utilisera pas < mais l'opérateur donné.
    Par exemple, pour trier un set par ordre décroissant:
    http://c.developpez.com/faq/cpp/?page=STL#STL_predicate

  3. #3
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    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 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Des pistes, s'achant que je ne détiens pas la vérité, peut-être des fragments :
    - std::less<> est 100% template, contrairement à std::less. Du coup on peux utiliser la spécialisation template sur less. -- op<() est surchargeable, donc probablement pas un argument
    - std::less<> est un foncteur particulier: il est de type std::binary_function. Du coup, diverses informations lui sont associées. Informations qui peuvent être récupérées pour composer ce foncteur avec d'autres foncteurs -- un effet de bord je dirai
    - un foncteur aussi court que std::less est inlinable. Passer op<() en paramètre revient à passer un pointeur vers une fonction. Soit une indirection qui se paiera à l'exécution -- un effet de bord pas complètement négligeable
    - op<() peut être libre ou membre. Et alors comment savoir lequel utiliser par défaut (/sans passer le truc explicitement) -- un bon candidat au pourquoi
    - std::less<T> est un type dont les objets ont un comportement associé à (). "op<(T,T)" est du même type que "bool toto(T,T)", l'instancier ne donne aucun comportement. -- un autre excellent candidat
    - Dans la même série.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    // exemple tiré de C++ Templates, the complete guide 
    // par Vandevoorde et Jossutis
     
    set<Person, less<Person> > c0, c1;
    set<Person, greater<Person> > c2;
    set<Person, autreCritere> c3;
     
    c0 = c1 ; // OK
    c1 = c2; // Erreur: types différents
    if (c1 == c3) // Erreur: types différents
      ...
    Vu que les trois types sont différents, on élimine les erreurs subtiles qui n'auraient pu être détectées qu'à l'exécution. -- effet de bord certainement pas négligeable


    - et bien evidemment, une contrainte était de pouvoir changer statiquement (dans le code) l'ordre utilisé sans reécrire une fois de plus le même code.
    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...

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

Discussions similaires

  1. std::vector semble ne pas utiliser std::move, pourquoi ?
    Par n0-sheep dans le forum SL & STL
    Réponses: 7
    Dernier message: 15/03/2014, 01h25
  2. Pourquoi utiliser XML?
    Par Community Management dans le forum XML/XSL et SOAP
    Réponses: 23
    Dernier message: 12/09/2008, 16h33
  3. Réponses: 7
    Dernier message: 25/11/2005, 17h11
  4. [D7] pourquoi utiliser un DBGrid ?
    Par raoulmania dans le forum Bases de données
    Réponses: 1
    Dernier message: 17/11/2005, 14h37

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