Maison >développement back-end >C++ >Pourquoi mon comparateur `std::set` personnalisé provoque-t-il une erreur d'incompatibilité de type ?

Pourquoi mon comparateur `std::set` personnalisé provoque-t-il une erreur d'incompatibilité de type ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-23 14:11:17897parcourir

Why Does My Custom `std::set` Comparator Cause a Type Mismatch Error?

Erreur : type incompatible dans la définition de comparateur std::set personnalisée

Dans votre code, vous essayez de spécifier une fonction de comparateur personnalisée pour trier les éléments dans un std ::défini en utilisant l'ordre lexicographique au lieu de l'ordre numérique. Cependant, le message d'erreur indique qu'il y a une erreur de non-concordance de type dans la déclaration de votre comparateur personnalisé.

Le problème survient parce que vous déclarez lex_compare comme une fonction avec deux paramètres int64_t qui renvoie une valeur booléenne. Cependant, le modèle pour std::set attend un comparateur qui implémente le std::less<> modèle. std::moins<> est un objet fonction avec la signature suivante :

template <typename T>
struct less {
  bool operator()(const T& a, const T& b) const;
};

Pour résoudre ce problème, vous devez implémenter lex_compare pour vous conformer au std::less<> signature. Voici une modification de votre code :

struct lex_compare {
  bool operator()(const int64_t& a, const int64_t& b) const {
    stringstream s1, s2;
    s1 << a;
    s2 << b;
    return s1.str() < s2.str();
  }
};

std::set<int64_t, lex_compare> s;

Maintenant, la structure lex_compare implémente la fonction Operator() qui prend deux arguments int64_t et renvoie une valeur booléenne, qui correspond à la signature de std::less<> . En spécifiant ce comparateur personnalisé dans la définition de votre std::set, vous pouvez modifier le comportement de classement de l'ensemble pour trier les éléments de manière lexicographique.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn