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

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

Patricia Arquette
Freigeben: 2024-12-24 13:49:14
Original
673 Leute haben es durchsucht

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

Benutzerdefinierte Typen als Schlüssel in std::maps

Problem: Kryptischer Compilerfehler bei der Verwendung von Karten mit benutzerdefinierten Typen

In C Beim Programmieren kommt es bei der Verwendung von STL-Maps mit benutzerdefinierten Klassen häufig zu kryptischen Compilerfehlern. Insbesondere wird die Fehlermeldung „Keine Übereinstimmung für ‚Operator<‘“ angezeigt. in '__x < __y'" kommt häufig vor, wenn versucht wird, mit einem Schlüssel eines benutzerdefinierten Typs auf ein Element zuzugreifen.

Verstehen des Fehlers

Die Fehlermeldung deutet darauf hin, dass der Compiler nicht in der Lage ist um den Operator < zu finden zum Vergleich zweier Instanzen des benutzerdefinierten Typs. Dies liegt daran, dass STL-Karten standardmäßig einen Vergleichsoperator (Operator<) benötigen, um ihre Schlüssel zu ordnen. Beim Arbeiten mit benutzerdefinierten Typen ist dieser Operator jedoch nicht automatisch verfügbar.

Lösung 1: Komparator-Funktionsobjekt

Anstatt den Operator< Für einen benutzerdefinierten Typ kann man eine Komparatorfunktionsobjektklasse erstellen. Diese Klasse implementiert eine spezielle Version von „operator()“, die die relative Reihenfolge des benutzerdefinierten Typs bestimmt. Die Karte kann dann spezialisiert werden, um diesen Komparator zu verwenden:

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

std::map<Class1, int, Class1Compare> c2int;</p>
<h3>Lösung 2: Spezialisieren von std::less</h3>
<p>Eine andere Alternative besteht darin, die std::less-Vorlage für die benutzerdefinierten zu spezialisieren Typ. Dies stellt eine benutzerdefinierte Definition für „operator()“ innerhalb der Klasse „std::less“ bereit:</p>
<pre class="brush:php;toolbar:false">namespace std {
    template<> struct less<Class1> {
       bool operator() (const Class1&amp; lhs, const Class1&amp; rhs) const {
           return lhs.id < rhs.id;
       }
    };
}
Nach dem Login kopieren

Dieser Ansatz ermöglicht es der Karte, zum Vergleich standardmäßig „std::less“ zu verwenden, während gleichzeitig eine spezifische Implementierung für den Benutzer bereitgestellt wird. definierter Typ.

Fazit

Bei der Arbeit mit STL-Maps und benutzerdefinierten Typen ist es wichtig, eine Methode zum Vergleichen der Schlüssel bereitzustellen. Dies kann entweder durch ein Komparatorfunktionsobjekt oder durch Spezialisierung auf std::less erreicht werden. Durch die Erfüllung dieser Anforderung können Entwickler Karten mit benutzerdefinierten Typen als Schlüssel effektiv nutzen.

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