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;
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; } };
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:
mapg_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!