Heim > Backend-Entwicklung > C++ > Warum schlagen „char*'-Schlüssel in „std::map' fehl und wie kann ich das beheben?

Warum schlagen „char*'-Schlüssel in „std::map' fehl und wie kann ich das beheben?

Linda Hamilton
Freigeben: 2024-12-26 04:49:15
Original
541 Leute haben es durchsucht

Why Do `char*` Keys Fail in `std::map`, and How Can I Fix It?

Die Verwirrung von char*-Schlüsseln in std::map

Beim Umgang mit Hash-basierten Containern wie std::map, Schlüssel verstehen Typen sind entscheidend. Bei der Verwendung von char* als Kartenschlüssel entsteht ein besonderes Problem, wie im folgenden Code dargestellt:

std::map<char*, int> g_PlayerNames;
Nach dem Login kopieren

Dieser Code versucht, Spielernamen (char*) als Schlüssel und entsprechende Ganzzahlen als Werte zu speichern. Bei der Suche nach einem Eintrag mit einem bekannten Namen schlägt der Vergleich jedoch fehl und führt zu unerwarteten Ergebnissen.

Die Ursache liegt in der besonderen Natur von char als Schlüssel. std::map vergleicht Schlüssel standardmäßig mit dem Kleiner-als-Operator (<). Bei char-Zeigern überprüft dieser Vergleich jedoch die Zeigeradressen und nicht die Zeichenfolgen, auf die sie verweisen.

Um dieses Problem zu beheben, müssen wir eine benutzerdefinierte Vergleichsfunktion bereitstellen, die nicht auf die tatsächlichen Zeichenfolgen angewendet wird die Zeiger. Durch die Einführung einer Struktur wie der folgenden können wir dies tun:

struct cmp_str
{
    bool operator()(char const *a, char const *b) const
    {
        return std::strcmp(a, b) < 0;
    }
};
Nach dem Login kopieren

Durch die Bereitstellung dieser benutzerdefinierten Vergleichsfunktion weisen wir std::map an, char*-Schlüssel basierend auf den Zeichenfolgen zu vergleichen, auf die sie verweisen, um den richtigen Schlüssel sicherzustellen Übereinstimmung beim Suchen und Einfügen.

Anstatt also die ursprüngliche Kartendefinition zu verwenden, ändern wir sie, um den Vergleich einzubeziehen Funktion:

map g_PlayerNames;

Mit dieser Änderung funktioniert die Such- und Aktualisierungslogik des Spielernamens wie vorgesehen, wobei die Vergleichsfunktion verwendet wird, um char*-Schlüssel basierend auf ihrem Zeichenfolgeninhalt abzugleichen.

Das obige ist der detaillierte Inhalt vonWarum schlagen „char*'-Schlüssel in „std::map' fehl und wie kann ich das 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