Maison >développement back-end >C++ >Comment définir un comparateur personnalisé pour le conteneur std::set ?

Comment définir un comparateur personnalisé pour le conteneur std::set ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-17 10:37:25800parcourir

How to Define a Custom Comparator for the std::set Container?

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 classe std::set". Dans votre code, "lex_compare" n'est pas un type qui peut remplir le rôle de _Compare.

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!

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