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

Wie kann ich benutzerdefinierte benutzerdefinierte Typen als Schlüssel in C-Maps verwenden?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-29 05:16:15667Durchsuche

How Can I Use Custom User-Defined Types as Keys in C   Maps?

Benutzerdefinierte benutzerdefinierte Typen als Map-Schlüssel in C

Maps in der C-Standardbibliothek bieten effiziente Such- und Einfügevorgänge für Schlüsselwerte Paare. Beim Versuch, benutzerdefinierte Klassen als Zuordnungsschlüssel zu verwenden, können Entwickler jedoch aufgrund des Fehlens einer geeigneten Vergleichsfunktion auf kryptische Fehlermeldungen stoßen.

Eine häufige Fehlermeldung lautet: „keine Übereinstimmung für ‚Operator<‘“ in '__x < __y'". Dieser Fehler tritt auf, weil die Karte einen Komparator oder Vergleichsoperator (z. B. Operator<) benötigt, um die Reihenfolge der Schlüssel zu bestimmen.

Standardmäßig verwenden Karten den Vorlagenparameter std::less comparator, um die Reihenfolge der Schlüssel zu definieren . Wenn der Schlüsseltyp den Operator< Überlastung, std::less wird den Vergleich an ihn delegieren. Bei benutzerdefinierten Typen ist es jedoch nicht immer angebracht, den Operator< zu überladen.

Um dieses Problem zu lösen, gibt es mehrere Ansätze:

  1. Komparator Funktionsobjekt: Erstellen Sie eine separate Klasse, die den für Ihren benutzerdefinierten Typ spezifischen Vergleich implementiert. Im bereitgestellten Code wird eine Class1Compare-Klasse mit einer Operator()-Funktion definiert, die Class1-Instanzen basierend auf ihren ID-Mitgliedern vergleicht.

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

    Geben Sie dann beim Instanziieren der Karte das Komparatorfunktionsobjekt als drittes an Vorlagenparameter:

    std::map<Class1, int, Class1Compare> c2int;</p>
    <li>
    <p><strong>Vorlagenspezialisierung von std::less</strong>: Eine weitere Möglichkeit besteht darin, die std::less-Vorlage für Ihren benutzerdefinierten Typ zu spezialisieren. Dadurch können Sie die Vergleichslogik direkt im std-Namespace definieren.</p>
    <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 Spezialisierung von std::less können Sie vermeiden, dass ein expliziter Operator< Überladung auf andere Teile Ihres Codes, wodurch Ihre Vergleichslogik stärker gekapselt wird.

  2. Durch die Verwendung eines dieser Ansätze können Sie die Einschränkungen überwinden, die durch die Verwendung benutzerdefinierter Typen als Zuordnungsschlüssel und -gewinn entstehen Nutzen Sie die Vorteile der effizienten Mapping-Funktionen der C-Standardbibliothek.

    Das obige ist der detaillierte Inhalt vonWie kann ich benutzerdefinierte benutzerdefinierte Typen als Schlüssel in C-Maps 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