2009-10-29 2 views
39

Ich habe kürzlich entdeckt, dass die Implementierung der Hash-Map in C++ unordered_map heißen wird.Unterschied zwischen hash_map und unordered_map?

Als ich aufblickte, warum sie nicht nur hash_map verwendet haben, entdeckte ich, dass offenbar Kompatibilitätsprobleme bei der Umsetzung von hash_map dass unordered_map Entschlüsse sind (weitere Informationen here).

Diese Wiki-Seite gibt nicht viel mehr Informationen, also frage ich mich, ob jemand einige der Probleme mit hash_map wusste, die unordered_map löst.

Antwort

63

Da in der C++ - Standardbibliothek keine Hash-Tabelle definiert war, würden verschiedene Implementierer der Standardbibliotheken eine nicht standardmäßige Hash-Tabelle mit dem Namen hash_map bereitstellen. Da diese Implementierungen nicht nach einem Standard geschrieben wurden, hatten sie alle subtile Unterschiede in Funktionalität und Leistungsgarantien.

Beginnend mit C++11 wurde eine Hashtabellenimplementierung zum C++ Standardbibliotheksstandard hinzugefügt. Es wurde entschieden, einen alternativen Namen für die Klasse zu verwenden, um Kollisionen mit diesen nicht standardmäßigen Implementierungen zu verhindern und eine unbeabsichtigte Verwendung der neuen Klasse durch Entwickler zu verhindern, die hash_table in ihrem Code hatten.

Der gewählte alternative Name ist unordered_map, der wirklich beschreibender ist, da er auf die Kartenschnittstelle der Klasse und die ungeordnete Natur ihrer Elemente verweist.

+4

Und das ist eine der Sachen, die zeigen, dass der 'std' Namensraum nicht ganz das tat, was er gehofft hatte. Nicht, dass ich weiß, was das Problem vernünftigerweise verhindert hätte. –

+1

Ein verschachtelter Namespace, wie tr1 ... –

+0

MSVC hatte stdext für ihre Standard-Erweiterungsbibliotheken. – Puppy