Il y a trois façons de le faire:
Vous pouvez surcharger operator<
pour votre classe:
bool operator<(const MyType& lhs, const MyType& rhs) {return lhs.a<rhs.a;}
Ceci a pour inconvénient que, si jamais vous voulez les trier selon b
, vous Je n'ai pas de chance. Vous pouvez également vous spécialiser std::less
pour votre type. Cela fait std::sort
de travail (et d'autres choses, comme l'utilisation du type comme une clé dans une carte) sans détourner operator<
pour cette signification. Cependant, il détourne toujours une syntaxe de comparaison générale pour a
, alors que vous pourriez, à d'autres endroits dans votre code, comparer votre type selon b
.
Ou vous pouvez écrire votre propre comparateur comme ceci:
struct compare_by_a {
bool operator()(const MyType& lhs, const MyType& rhs) const
{return lhs.a<rhs.a;}
};
(Note:.. Le const
après que l'opérateur ne soit pas strictement nécessaire, je considère encore un bon style, cependant) Ce laisse le général- but, moyen de comparaison indéfini; donc, si un code veut les utiliser sans que vous le sachiez, la compilation émet une erreur et vous en informe. Vous pouvez utiliser ce comparateur ou d'autres comparateurs de manière sélective et explicite lorsque vous avez besoin d'une comparaison.
Une autre option est de spécialiser 'std :: less' pour votre type. De cette façon, vous n'avez pas besoin de passer le foncteur à chaque fois (par exemple parce qu'il y a vraiment une définition raisonnable), et pourtant votre type n'a pas 'operator <'. –
type_is_less peut également être un "objet fonction" (un objet surchargeant l'opérateur()) – newacct
Cela a un défaut sérieux en ce que 'operator <' n'est pas 'const'. Cela signifie que cela ne fonctionnera pas pour le code qui considère le côté gauche de la constante de comparaison. (BTW, je l'ai vu si souvent mal, cela suffit à eux seuls pour rendre ces opérateurs globaux, beaucoup moins de gens se trompent ainsi.) Bien sûr, il y a d'autres raisons aussi.) – sbi