Maison >développement back-end >C++ >Comment définir un comparateur personnalisé pour le conteneur std::set ?
Utilisation du comparateur std::set personnalisé
Introduction :
Dans les algorithmes de tri et de recherche , les comparateurs personnalisés sont utilisés pour spécifier un ordre alternatif pour les éléments d'un conteneur. Cela permet un tri personnalisé ou une recherche basée sur des critères spécifiques. Explorons comment définir un comparateur personnalisé pour le conteneur std::set.
Étude de cas :
Considérez un ensemble d'entiers pour lequel vous souhaitez un ordre lexicographique au lieu d'un ordre numérique. commande. Cela signifie que les éléments « 1234 » et « 10000 » doivent être traités comme étant dans l'ordre (lexicographiquement) même si « 10000 » est numériquement plus grand.
Erreur et solution :
L'erreur que vous avez rencontrée est due au fait que g attend un comparateur conforme à une certaine liste de paramètres de modèle, en particulier "template
Solution :
Il existe plusieurs façons de définir un comparateur personnalisé pour std ::set:
1. Solution C 20 moderne :
Dans C 20 et versions ultérieures, vous pouvez utiliser directement les fonctions lambda comme comparateurs :
auto cmp = [](int a, int b) { return a < b; }; // Arbitrary example std::set<int, decltype(cmp)> s;
2. Solution C 11 moderne :
En C 11 et versions ultérieures, vous pouvez utiliser une fonction lambda avec le constructeur d'ensemble :
auto cmp = [](int a, int b) { return a < b; }; // Arbitrary example std::set<int, decltype(cmp)> s(cmp);
3. Objet fonction :
Vous pouvez définir un objet fonction avec une fonction Operator() renvoyant un booléen :
struct Compare { bool operator()(const int &a, const int &b) { return a < b; } // Arbitrary example }; std::set<int, Compare> s;
4. std::integral_constant:
Vous pouvez utiliser std::integral_constant pour créer un type qui se convertit implicitement en pointeur de fonction :
#include <type_traits> struct Compare { bool operator()(const int &a, const int &b) { return a < b; } // Arbitrary example }; using Cmp = std::integral_constant<decltype(&Compare::operator()), &Compare::operator()>; std::set<int, Cmp> s;
Conclusion :
En définissant un comparateur personnalisé, vous avez plus de contrôle sur l'ordre des éléments dans votre ensemble, vous permettant de réaliser des exigences de tri spécifiques.
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!