Heim >Backend-Entwicklung >C++ >Wie kann ich benutzerdefinierte Typen als Schlüssel in std::maps in C verwenden?

Wie kann ich benutzerdefinierte Typen als Schlüssel in std::maps in C verwenden?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-22 18:14:14777Durchsuche

How Can I Use User-Defined Types as Keys in std::maps in C  ?

Hindernisse überwinden: Verwendung von std::maps mit benutzerdefinierten Typen als Schlüssel

Im Bereich der Zuordnung von Schlüssel-Wert-Paaren in C , kommt es nicht selten vor, dass benutzerdefinierte Typen zum Definieren von Schlüsseln bevorzugt werden. Beim Versuch, std::maps mit benutzerdefinierten Schlüsseln zu verwenden, kann es jedoch während der Kompilierung zu einer kryptischen Fehlermeldung kommen. Um diesen Fehler und seine Bedeutung zu verstehen, schauen wir uns die Nuancen von std::maps und benutzerdefinierten Typen an.

Bei der Arbeit mit std::maps verlassen wir uns oft auf primitive Typen als Schlüssel, wie zum Beispiel Ganzzahlen oder Saiten. Primitive Typen verfügen über klar definierte Vergleichsoperatoren (<, >, == usw.), die eine effiziente Schlüsselreihenfolge innerhalb der Karte ermöglichen. Bei der Verwendung benutzerdefinierter Typen als Schlüssel ist jedoch zu beachten, dass die Implementierung dieser Vergleichsoperatoren für das korrekte Funktionieren der Karte von entscheidender Bedeutung ist. Hier kommt die Fehlermeldung ins Spiel, auf die Sie gestoßen sind.

Der in der Frage erwähnte Fehler deutet auf das Fehlen eines Operators hin< Implementierung für die benutzerdefinierte Klasse1. Standardmäßig verlässt sich std::maps auf die Methode less<> Vorlage zum Vergleichen von Schlüsseln. weniger<> ruft intern den Operator< für den Schlüsseltyp definiert. Leider fehlt dieser Operator in Klasse1, was zu einem Kompilierungsfehler führt.

Um dieses Problem zu beheben, gibt es mehrere praktikable Lösungen:

  1. Operator implementieren<: Definieren ein Operator< Mitgliedsfunktion innerhalb von Klasse1, die ein Vergleichskriterium für die Schlüsselreihenfolge festlegt. Es lohnt sich jedoch zu überlegen, ob die Bereitstellung von Operator< für Ihre Klasse macht aus logischer Sicht Sinn.
  2. Ein Komparator-Funktionsobjekt verwenden: Anstatt den Operator< zu implementieren, erstellen Sie ein separates Komparator-Funktionsobjekt, das die Vergleichslogik kapselt. Dies ermöglicht eine größere Flexibilität und Code-Modularität. Ein Beispiel für einen solchen Ansatz ist im folgenden Codeausschnitt dargestellt:
struct Class1Compare {
    bool operator() (const Class1& lhs, const Class1& rhs) const {
        return lhs.id < rhs.id;
    }
};

std::map<Class1, int, Class1Compare> c2int;</p>
<ol start="3"><li>
<strong>Specializing std::less:</strong> Wenn die Vergleichssemantik für Ihre Verwendung nicht entscheidend ist In diesem Fall sollten Sie erwägen, die Vorlage „std::less“ auf Klasse 1 zu spezialisieren. Mit diesem Ansatz können die Vergleichskriterien außerhalb des Bereichs von Klasse 1 definiert werden, wodurch der Code erweiterbarer wird.</li></ol>
<pre class="brush:php;toolbar:false">namespace std {
    template<> struct less<Class1> {
        bool operator() (const Class1& lhs, const Class1& rhs) const {
            return lhs.id < rhs.id;
        }
    };
}

Durch die Verwendung eines dieser Ansätze können Sie den Fehler beheben und std erfolgreich nutzen: :maps mit benutzerdefinierten Typen als Schlüssel. Es ist wichtig, die Lösung zu wählen, die am besten zu den Anforderungen und Designprinzipien Ihres Projekts passt.

Das obige ist der detaillierte Inhalt vonWie kann ich benutzerdefinierte Typen als Schlüssel in std::maps in C verwenden?. 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