Question

J'ai stl :: liste contenant des objets de classe Widget. Ils doivent être triés selon deux membres dans la classe Widget.

Pour le tri de travail, d'un deux objets Widget moins que comparateur comparant doit être définie. Il semble y avoir une multitude de façons de le faire. D'après ce que je peux comprendre, on peut soit:

a. Définir une surcharge de l'opérateur de comparaison dans la classe:

bool Widget::operator< (const Widget &rhs) const

b. Définir une fonction autonome en prenant deux Widgets:

bool operator<(const Widget& lhs, const Widget& rhs);

Et puis faire la classe Widget un ami de celui-ci:

class Widget {
    // Various class definitions ...
    friend bool operator<(const Widget& lhs, const Widget& rhs);
};

c. Définir un foncteur puis l'inclure comme paramètre lors de l'appel de la fonction de tri:

class Widget_Less :
public binary_function<Widget, Widget, bool> { 
    bool operator()(const Widget &lhs, const Widget& rhs) const;
};

Quelqu'un sait quelle méthode est la meilleure? En particulier, je suis intéressé de savoir si je dois faire 1 ou 2. Je fouillé le livre STL efficace par Scott Meyer, mais malheureusement, il n'a rien à dire à ce sujet.

Je vous remercie de votre réponse.

Était-ce utile?

La solution

Si vous ne comparez deux Widgets à l'autre, utilisez un operator < membre. Si vous comparez Widget pour quelque chose d'autre, définir une operator < globale (la version deux paramètres, le cas échéant un ami de la classe Widget mais qui est une question distincte.

Functor vous voulez vraiment que si vous faites quelque chose d'un peu moins orthodoxe. Choisissez un foncteur si une comparaison « moins » n'a pas de sens dans le contexte des widgets. Dans ce cas, ayant operator < pourrait être source de confusion. Bien sûr, foncteurs doivent encore fournir une commande, mais juste parce qu'il est un ordre ne signifie pas vraiment un « moins » opération. (Exemple, le tri des états par la population est probablement mieux pour un foncteur qu'un operator <.

Autres conseils

a. b. Opérateur de comparaison pour deux Widgets n'est pas chose intuitive pour moi. Maintenant, je ne vois pas ce qu'il peut faire. De plus, si cette fonction est pas intuitive une fois que vous aurez besoin d'un nouvel opérateur de comparaison, ce que vous pouvez faire dans ce cas?

Je préfère foncteur.

Ils devraient tous être les mêmes en termes de performance, mais il existe d'autres différences entre les:

  • Les deux premières, sauf que vous ayez à spécifier explicitement le comparateur, et peut être utilisé facilement avec d'autres opérations, peut-être ceux qui sont mal définies qui ne permettent pas la spécification explicite d'un comparateur.

  • Seul le foncteur permet des données supplémentaires pour la comparaison. Par exemple, si vous compariez ints, vous pouvez créer une comparaison qui compare leur distance à partir d'un troisième point, P, qui serait un membre de l'instance de foncteur.

  • Foncteurs sont généralement moins faciles à lire (à ceux qui ne connaissent C ++).

Notez que vous n'avez pas besoin d'hériter binary_operator pour que cela fonctionne, bien qu'il ne vous donne quelques belles typedefs.

Pour la plupart des cas, un. et B. sont identiques. Donc, la vraie question est, quand utiliser a / b et quand utiliser c.

La réponse est: utilisez a ou b si « moins » est logique pour votre objet en termes non équivoques. Si votre classe est un nombre, utilisez <.

Si « moins » n'a pas de sens dans le contexte de votre classe, alors s'il vous plaît ne « opérateur < » ne pas surcharger votre classe. Il dérouter les utilisateurs. Utilisez c. à la place, et soit en faire une classe imbriquée ou typedef à l'intérieur de votre classe afin que vous puissiez l'écrire comme Widget::Compare.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top