Dans cet article, nous proposons des solutions pour personnaliser les critères de comparaison dans un conteneur std::set à l'aide de comparateurs personnalisés .
Un std::set est une collection ordonnée d'éléments uniques, et par défaut, il classe les éléments par ordre croissant. Cependant, nous souhaiterons peut-être définir notre propre logique de comparaison pour modifier ce comportement. Explorons les scénarios suivants dans lesquels les comparateurs personnalisés peuvent être utiles :
Dans l'exemple fourni, nous avons l'intention de modifier l'ordre des entiers dans un std::set en lexicographique au lieu de numérique. Nous définissons une fonction de comparaison personnalisée lex_compare qui convertit chaque entier en une représentation sous forme de chaîne, puis compare les chaînes. Cependant, ce code ne parvient pas à se compiler.
L'erreur se produit car le code fourni transmet la fonction de comparaison personnalisée lex_compare comme argument au modèle std::set. Cependant, le deuxième paramètre de modèle de std::set attend un type, pas une fonction. Pour résoudre ce problème, nous pouvons employer différentes méthodes :
1. Utilisation d'une fonction Lambda comme comparateur :
auto cmp = [](int64_t a, int64_t b) { return a < b; }; std::set<int64_t, decltype(cmp)> s;
En C 20 et versions ultérieures, nous pouvons directement utiliser une fonction lambda comme comparateur. Le lambda prend deux arguments (éléments comparables) et renvoie un booléen indiquant leur ordre.
2. Utiliser une fonction comme comparateur :
bool cmp(int64_t a, int64_t b) { return a < b; } std::set<int64_t, decltype(&cmp)> s(&cmp);
Si les expressions lambda ne sont pas préférées, nous pouvons définir une fonction booléenne distincte cmp et la transmettre au constructeur std::set. Notez que dans ce cas, nous devons fournir l'opérateur d'adresse (&) pour transmettre une référence à la fonction.
3. Utilisation d'une structure avec un opérateur d'appel de fonction :
struct cmp { bool operator()(int64_t a, int64_t b) { return a < b; } }; std::set<int64_t, cmp> s;
Cette approche définit une structure avec un opérateur d'appel de fonction qui implémente la logique de comparaison. La structure est ensuite utilisée comme comparateur pour l'ensemble.
En employant ces techniques, nous pouvons personnaliser efficacement le comportement de classement d'un std::set pour répondre à des exigences 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!