Comment puis-je surcharge le comparer opérateur pour un ensemble de paires?
Comment puis-je la surcharge et passer un <
(moins de) comparateur à un ensemble de paires d'entiers? Voici mon code actuel:
class A{
public:
typedef std::pair<int, int> pair_type;
bool operator<(const pair_type& a, const pair_type& b){
if (a.first < b.first) return true;
else if ( (a.first == b.first) && (a.second < b.second) ) return true;
else return false;
}
private:
std::set< pair_type > edge_;
};
Si j'essaie de compiler ce code, j'obtiens l'erreur suivante:
error: 'bool A::operator<(const pair_type&, const pair_type&)' must take exactly one argument
Comment puis-je résoudre ce problème?
std::pair
déjà un opérateur<.
Vous devez vous connecter pour publier un commentaire.
Vous devez être definining la surcharge de l'opérateur en tant que membre de la classe (avec un seul paramètre, généralement une autre instance de la même classe):
Votre opérateur doit être libre de la fonction (qui n'est pas membre-fonction), car il n'a pas toutes les relations de
A
classe.Depuis C++11, vous pouvez également utiliser un expression lambda au lieu de définir un comparateur struct:
J'ai aussi compacté votre comparateur de code afin de sauver deux lignes. Maintenant, vous pouvez définir votre défini de la manière suivante:
Toutefois, si vous voulez utilisez le comparateur pour un jeu qui est un membre de la classe, alors c'est un peu moins à l'aise, parce que vous avez à passer le comparateur également à la constructeur de l'ensemble, comme indiqué ci-dessus.
Ce qui signifie, vous l'avez à portée de main sur le comparateur dans la liste d'initialiseur de l'constructeur définition:
Code sur Ideone