Wie kann ich eine case-insensitive unordered_map<string, int>
erstellen?
Reicht das Überschreiben key_equal
aus oder muss ich auch hasher
aktualisieren?case insensitive unordered_map <string, int>
8
A
Antwort
2
Hasher muss ebenfalls aktualisiert werden, da der Standard-Hashalgorithmus does not produce identical hash code for strings that differ only in the case of their symbols - eine essentielle Eigenschaft der Hash-Code-Funktion ist, die für die Verwendung von Groß- und Kleinbuchstaben verwendet werden soll.
std::string s1 = "Hello";
std::string s2 = "hello";
std::hash<std::string> hash_fn;
size_t hash1 = hash_fn(s1);
size_t hash2 = hash_fn(s2);
std::cout << hash1 << '\n';
std::cout << hash2 << '\n';
Dies zeigt unterschiedliche Werte auf ideone:
101669370
3305111549
Ihre Antwort richtig ist im Allgemeinen, aber wir sprechen über 'std :: Hash' Funktion hier. Ihre Antwort kann also falsch sein, je nachdem, wie 'std :: hash ' für Strings funktioniert (was ich nicht weiß)! –
MBZ
@MBZ Es wäre nicht sinnvoll, den 'std :: hash' zu ändern, damit' string's keinen Zeichenfall berücksichtigt: Die Funktion wäre in Bezug auf die CPU-Nutzung teurer und würde auch zu mehr Kollisionen führen . – dasblinkenlight
Sie könnten einfach alle Zeichenfolgen Kleinbuchstaben machen, bevor Sie sie Hash- – aaronman