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
Libérer: 2024-12-17 10:37:25
original
799 Les gens l'ont consulté

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;
Copier après la connexion

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);
Copier après la connexion

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;
Copier après la connexion

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;
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal