Heim > Backend-Entwicklung > C++ > Warum erhalte ich kryptische Fehler, wenn ich benutzerdefinierte Typen als Schlüssel in „std::map' verwende, und wie kann ich diese beheben?

Warum erhalte ich kryptische Fehler, wenn ich benutzerdefinierte Typen als Schlüssel in „std::map' verwende, und wie kann ich diese beheben?

Linda Hamilton
Freigeben: 2024-12-22 07:53:10
Original
112 Leute haben es durchsucht

Why Do I Get Cryptic Errors When Using User-Defined Types as Keys in `std::map`, and How Can I Fix Them?

So verwenden Sie std::Maps mit benutzerdefinierten Typen als Schlüssel: Den kryptischen Fehler und alternative Ansätze verstehen

Einführung

Beim Versuch, STL-Maps mit benutzerdefinierten Klassen als Schlüssel zu verwenden, können Programmierer auf kryptische Fehlermeldungen stoßen, die die Arbeit behindern ihre Fortschritte. In diesem Artikel wird der Grund für diesen Fehler untersucht und alternative Ansätze für den effektiven Einsatz von std::maps untersucht.

Der kryptische Fehler und die Ursache

Wie im bereitgestellten Beispiel dargestellt Die Verwendung benutzerdefinierter Typen als Zuordnungsschlüssel löst einen Fehler aus, der darauf zurückzuführen ist, dass der Compiler keinen geeigneten Vergleichsoperator für den spezifischen Typ finden kann. In diesem Fall ist std::map auf die Verfügbarkeit des Operators< angewiesen. Funktion zur Bestimmung der Reihenfolge von Elementen.

Alternative Ansätze

1. Komparator-Funktionsobjekt:

Eine Methode zur Umgehung des Fehlers besteht darin, ein Komparator-Funktionsobjekt zu definieren, das den Operator< Funktionalität. Mit diesem Ansatz können Sie eine Vergleichslogik einrichten, ohne sie über eine Operatorüberladung für die benutzerdefinierte Klasse verfügbar zu machen.

Zum Beispiel verwendet das folgende Codefragment ein Komparatorfunktionsobjekt, um Instanzen der Klasse 1 zu vergleichen und zu ordnen:

struct Class1Compare
{
   bool operator() (const Class1& lhs, const Class1& rhs) const
   {
       return lhs.id < rhs.id;
   }
};

std::map c2int;

2. Spezialisierung von std::less:

Ein alternativer Ansatz besteht darin, die Vorlage std::less zu spezialisieren, um die Vergleichssemantik speziell für den benutzerdefinierten Typ bereitzustellen. Dies gewährleistet eine nahtlose Integration mit dem Standardvergleichsverhalten von std::map, ohne dass ein expliziter Operator< verfügbar gemacht wird. Überladung:

namespace std
{
    template<> struct less
    {
       bool operator() (const Class1& lhs, const Class1& rhs) const
       {
           return lhs.id < rhs.id;
       }
    };
}

Durch die Übernahme einer dieser Alternativen können Programmierer std::maps effektiv mit benutzerdefinierten Typschlüsseln verwenden, wodurch die Notwendigkeit eines expliziten Operators < entfällt. Überlastungen unter Beibehaltung der Flexibilität und Effizienz, die STL-Karten bieten.

Das obige ist der detaillierte Inhalt vonWarum erhalte ich kryptische Fehler, wenn ich benutzerdefinierte Typen als Schlüssel in „std::map' verwende, und wie kann ich diese beheben?. 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