Heim > Backend-Entwicklung > C++ > Wie definiere ich einen benutzerdefinierten Komparator für den std::set-Container?

Wie definiere ich einen benutzerdefinierten Komparator für den std::set-Container?

Susan Sarandon
Freigeben: 2024-12-17 10:37:25
Original
791 Leute haben es durchsucht

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

Verwenden des benutzerdefinierten std::set Comparators

Einführung:

In Sortier- und Suchalgorithmen werden benutzerdefinierte Komparatoren verwendet, um eine alternative Reihenfolge für Elemente in einem Container anzugeben. Dies ermöglicht eine individuelle Sortierung oder Suche nach bestimmten Kriterien. Lassen Sie uns untersuchen, wie Sie einen benutzerdefinierten Komparator für den std::set-Container definieren.

Fallstudie:

Stellen Sie sich eine Menge von Ganzzahlen vor, bei der Sie eine lexikografische statt einer numerischen Reihenfolge wünschen Bestellung. Dies bedeutet, dass die Elemente „1234“ und „10000“ als in Ordnung (lexikographisch) behandelt werden sollten, auch wenn „10000“ numerisch größer ist.

Fehler und Lösung:

Der Fehler, auf den Sie gestoßen sind, liegt daran, dass g einen Komparator erwartet, der einer bestimmten Vorlagenparameterliste entspricht, insbesondere „template In Ihrem Code ist „lex_compare“ kein Typ, der die Rolle von _Compare erfüllen kann.

Lösung:

Es gibt mehrere Möglichkeiten, einen benutzerdefinierten Komparator für std zu definieren ::set:

1. Moderne C 20-Lösung:

In C 20 und höher können Sie Lambda-Funktionen direkt als Komparatoren verwenden:

auto cmp = [](int a, int b) { return a < b; };  // Arbitrary example
std::set<int, decltype(cmp)> s;
Nach dem Login kopieren

2. Moderne C 11-Lösung:

In C 11 und höher können Sie eine Lambda-Funktion mit dem Mengenkonstruktor verwenden:

auto cmp = [](int a, int b) { return a < b; };  // Arbitrary example
std::set<int, decltype(cmp)> s(cmp);
Nach dem Login kopieren

3. Funktionsobjekt:

Sie können ein Funktionsobjekt mit einer Operator()-Funktion definieren, die einen booleschen Wert zurückgibt:

struct Compare {
    bool operator()(const int &a, const int &b) { return a < b; }  // Arbitrary example
};

std::set<int, Compare> s;
Nach dem Login kopieren

4. std::integral_constant:

Sie können std::integral_constant verwenden, um einen Typ zu erstellen, der implizit in einen Funktionszeiger konvertiert:

#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;
Nach dem Login kopieren

Schlussfolgerung:

Durch die Definition eines benutzerdefinierten Komparators haben Sie mehr Kontrolle über die Reihenfolge der Elemente in Ihrem Satz Sie können spezifische Sortieranforderungen erfüllen.

Das obige ist der detaillierte Inhalt vonWie definiere ich einen benutzerdefinierten Komparator für den std::set-Container?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage