2010-02-28 10 views
9

Ich habe eine Frage im Zusammenhang mit dem Verständnis der Funktionsweise von Python-Wörterbüchern.Der Unterschied zwischen Python-dict und tr1 :: unordered_map in C++

Ich erinnere mich irgendwo lesen Strings in Python sind unveränderlich, um Hashing zu ermöglichen, und es ist der gleiche Grund, warum man Listen nicht direkt als Schlüssel verwenden kann, dh die Listen sind veränderbar (durch Unterstützung von .append) und daher können sie nicht verwendet werden Wörterbuchschlüssel.

Ich wollte wissen, wie die Implementierung von unordered_map in C++ diese Fälle behandelt. (Da Zeichenfolgen in C++ veränderbar sind)

+2

Wünschte, ich könnte Posts bearbeiten, damit ich das "'" in "dict's" wegschneiden kann ... ;-) (Ja, ich bin in einer snarky Stimmung ;-) –

+0

Vielen Dank für den Beitrag! :-D –

Antwort

7

Schlüssel in allen C++ - Map/Set-Containern sind const und somit unveränderlich (nachdem sie dem Container hinzugefügt wurden).

Beachten Sie, dass C++ - Container nicht für Zeichenfolgenschlüssel spezifisch sind. Sie können beliebige Objekte verwenden, aber die Konstante verhindert Änderungen, nachdem der Schlüssel in den Container kopiert wurde.

+1

Was passiert, wenn jemand const_cast benutzt, um mit Schlüsseln herumzuspielen? Danke –

+0

Referenz: http://www.sgi.com/tech/stl/Map.html - 'value_type' ist definiert als" Der Typ des Objekts, 'Paar ', in der Karte gespeichert . " Beachten Sie die 'const'. – Dan

+4

@Akshay: Wenn jemand das macht, bekommen sie, was sie verdienen :) 'std :: map' wird mit einem rot-schwarzen Baum implementiert. Das Ändern eines Schlüssels würde den Baum ungültig machen. 'unordered_map' wird unter Verwendung einer Hash-Tabelle implementiert. Das Ändern eines Schlüssels würde bedeuten, dass Sie dieses Element wahrscheinlich nie wieder finden würden, weil es wahrscheinlich im falschen Hash-Bucket für seinen neuen Schlüssel wäre. – Dan

Verwandte Themen