Heim >Backend-Entwicklung >C++ >Wie kann ich die Vergleichskriterien in einem std::set mithilfe benutzerdefinierter Komparatoren anpassen?

Wie kann ich die Vergleichskriterien in einem std::set mithilfe benutzerdefinierter Komparatoren anpassen?

Linda Hamilton
Linda HamiltonOriginal
2024-12-20 17:25:10646Durchsuche

How to Customize the Comparison Criteria in a std::set Using Custom Comparators?

So verwenden Sie einen benutzerdefinierten Komparator mit std::set

In diesem Artikel stellen wir Lösungen zum Anpassen der Vergleichskriterien in einem std::set-Container mithilfe benutzerdefinierter Komparatoren bereit .

Ein std::set ist eine geordnete Sammlung eindeutiger Elemente und ordnet die Elemente standardmäßig in aufsteigender Reihenfolge. Möglicherweise möchten wir jedoch unsere eigene Vergleichslogik definieren, um dieses Verhalten zu ändern. Lassen Sie uns die folgenden Szenarien untersuchen, in denen benutzerdefinierte Komparatoren nützlich sein können:

Szenario: Benutzerdefinierte lexikografische Reihenfolge

Im bereitgestellten Beispiel beabsichtigen wir, die Reihenfolge von Ganzzahlen in einem std::set in lexikographisch zu ändern statt numerisch. Wir definieren eine benutzerdefinierte Komparatorfunktion lex_compare, die jede Ganzzahl in eine Zeichenfolgendarstellung umwandelt und dann die Zeichenfolgen vergleicht. Dieser Code kann jedoch nicht kompiliert werden.

Lösung

Der Fehler tritt auf, weil der bereitgestellte Code die benutzerdefinierte Komparatorfunktion lex_compare als Argument an die std::set-Vorlage übergibt. Der zweite Vorlagenparameter von std::set erwartet jedoch einen Typ und keine Funktion. Um dieses Problem zu lösen, können wir verschiedene Methoden anwenden:

1. Verwendung einer Lambda-Funktion als Komparator:

auto cmp = [](int64_t a, int64_t b) { return a < b; };
std::set<int64_t, decltype(cmp)> s;

In C 20 und höher können wir direkt eine Lambda-Funktion als Komparator verwenden. Das Lambda nimmt zwei Argumente (vergleichbare Elemente) und gibt einen booleschen Wert zurück, der ihre Reihenfolge angibt.

2. Verwenden einer Funktion als Komparator:

bool cmp(int64_t a, int64_t b) { return a < b; }
std::set<int64_t, decltype(&cmp)> s(&cmp);

Wenn Lambda-Ausdrücke nicht bevorzugt werden, können wir eine separate boolesche Funktion cmp definieren und sie an den std::set-Konstruktor übergeben. Beachten Sie, dass wir in diesem Fall den Adressenoperator (&) angeben müssen, um einen Verweis auf die Funktion zu übergeben.

3. Verwenden einer Struktur mit einem Funktionsaufrufoperator:

struct cmp {
    bool operator()(int64_t a, int64_t b) { return a < b; }
};

std::set<int64_t, cmp> s;

Dieser Ansatz definiert eine Struktur mit einem Funktionsaufrufoperator, der die Vergleichslogik implementiert. Die Struktur wird dann als Komparator für den Satz verwendet.

Durch den Einsatz dieser Techniken können wir das Bestellverhalten eines std::set effektiv anpassen, um bestimmte Anforderungen zu erfüllen.

Das obige ist der detaillierte Inhalt vonWie kann ich die Vergleichskriterien in einem std::set mithilfe benutzerdefinierter Komparatoren anpassen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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